まず、アプリケーションの90%でパフォーマンスの違いはまったく無関係であることを理解していますが、どちらがより高速な構成であるかを知る必要があります。それと...
現在ネット上で入手できる情報は混乱を招きます。多くの人がforeachは悪いと言いますが、反復子を使用して配列トラバーサルの記述を単純化することを想定しているため、技術的にはより高速であるはずです。イテレータ。これも高速であると思われますが、PHPでも明らかに非常に遅いです(または、これはPHPのものではありませんか?)。配列関数について話しています。next()、prev()、reset()など、関数のように見えるPHP言語機能の1つではない場合でも、
これを少し絞り込むと、配列を1以上のステップでトラバースすることには興味がありません(負のステップもありません。つまり、反復を逆にします)。また、任意のポイントとの間のトラバーサルには興味がなく、長さは0です。また、1000個を超えるキーを持つ配列の操作が定期的に発生することはありませんが、アプリケーションのロジックで配列が複数回トラバースされるのがわかります。また、操作に関しては、主に文字列操作とエコーのみです。
ここにいくつかの参照サイトがあります:
http : //www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php
私がどこでも聞くもの:
foreach
遅いため、for
/while
が速い- PHP
foreach
は反復する配列をコピーします。それをより速くするには、参照を使用する必要があります - このようなコード:より高速です
$key = array_keys($aHash); $size = sizeOf($key);
for ($i=0; $i < $size; $i++)foreach
これが私の問題です。私は次のテストスクリプトを作成しました:http : //pastebin.com/1ZgK07USそして、スクリプトを何度実行しても、次のような結果が得られます。
foreach 1.1438131332397
foreach (using reference) 1.2919359207153
for 1.4262869358063
foreach (hash table) 1.5696921348572
for (hash table) 2.4778981208801
要するに:
foreach
foreach
参照よりも速いforeach
より速いfor
foreach
for
ハッシュテーブルよりも高速
誰かが説明できますか?
- 私は何か間違ったことをしていますか?
- PHP foreachのリファレンスは本当に違いがあるのですか?参照渡しした場合、なぜコピーされないのですか?
- foreachステートメントの同等の反復子コードは何ですか。ネットでいくつか見たことがありますが、テストするたびにタイミングがずれています。また、いくつかの単純なイテレーター構造をテストしましたが、まともな結果も得られないようです-PHPの配列イテレーターはひどいですか?
- FOR / FOREACH(およびWHILE)以外の配列を反復処理するより高速な方法/メソッド/構成はありますか?
PHPバージョン5.3.0
編集:回答 ここにいる人々の助けを借りて、私はすべての質問に対する回答をまとめることができました。ここでそれらを要約します。
- 「私は何か間違ったことをしていますか?」コンセンサスは次のようです:はい、ベンチマークでエコーを使用できません。個人的には、エコーが実行時間のランダムな関数であるか、他の関数がどういうわけかどのように異なるかはまだわかりません-それと、スクリプトがforeachのまったく同じ結果をすべてよりも優れて生成する機能は難しいです「あなたはエコーを使っている」とだけ説明します(まあ私は何を使っていたのでしょう)。しかし、私はテストがより良いもので行われるべきであると認めます。理想的な妥協は思い浮かびませんが。
- 「PHPのforeach参照は実際に違いをもたらしますか?参照渡しした場合、なぜそれがコピーされないのですか?」ircmaxellは、そうであることを示しています。その後のテストでは、ほとんどの場合、参照がより高速であることが証明されるようです。ただし、上記のコードスニペットを考えると、すべてを意味しているわけではありません。私は、問題がおそらくそのようなレベルで悩むには直感的ではないので、実際にどちらの状況に適しているかを判断するために逆コンパイルなどの極端な何かを必要とすることを認めます。
- 「foreachステートメントの同等のイテレーターコードは何ですか。ネット上でいくつか見ましたが、それらをテストするたびにタイミングがずれています。いくつかの単純なイテレーターコンストラクトもテストしましたが、まともな結果すら得られないようです。 -PHPの配列イテレータはひどいですか?」ircmaxellが以下の答えを提供しました。ただし、コードはPHPバージョン> = 5でのみ有効な場合があります
- 「FOR / FOREACH(およびWHILE)以外の配列を反復処理するより高速な方法/メソッド/構成はありますか?」回答をありがとう、ゴードン。PHP5で新しいデータ型を使用すると、パフォーマンスが向上するか、メモリが向上します(状況によってはどちらが望ましい場合もあります)。速度に関しては、新しいタイプの配列の多くはarray()よりも優れているようには見えませんが、splpriorityqueueおよびsplobjectstorageはかなり高速であるように見えます。Gordonが提供するリンク:http : //matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/
助けてくれた皆さんありがとう。
単純なトラバーサルについては、おそらくforeach(非参照バージョン)を使用します。