2


0

PHPアンパック質問
list(,$nfields) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;

問題は、もし substr`が4バイトを返さなければならないのに "N *" `であり、それらがNとしてアンパックされるのか? そして、なぜ二重割り当てですか?

  • UPD *:このコードは、http://sphinxsearch.com/ [Sphinx]ネイティブPHPコネクターの一部です。 いくつかのコードをハッキングした後、このコードが4バイト整数を抽出することが明らかになりました。 しかし、二重代入と substr /` N * `の背後にある論理は、私にはまだはっきりしていません。 私は最終的にそれを理解するための恩恵を提供しています。

3 Answer


1


ファイルの改訂履歴を確認する必要がありますが、いくつかの可能性があります。

  1. これらは、漸進的だった以前のアルゴリズムの残りです 機能を削除しましたが、クリーンアップしませんでした。

  2. 悪い夜の後に私たち全員が作り出す典型的なスパゲッティコードです。

  3. これは、大きな入力文字列のコードを高速化する最適化です。

これらはすべて同義語です。


3つの整数を使用して、通常の1,000回のベンチマークを実行しましたが、* 1 の方がずっと高速です。 ただし、10,000個の整数を使用した同様のテストでは、 1 *が最も遅いことが示されています:-!

0.82868695259094 seconds
0.0046610832214355 seconds
0.0029149055480957 seconds

パフォーマンスが必須のフルテキストエンジンであるため、あえて最適化と言います。


0


コードはおそらくバグです。 この種のループがまさに `*`が存在する理由です…​


0


_ unpack( "N *"、substr($ response、$ p、4)); _

substr()からデータを解凍するときに使用する形式を指定します

N-符号なしlong、常に32ビット、ビッグエンディアンのバイト順