私は、製品ページでA-Zナビゲーションを生成するために書いたコードを見落としていましたが、その方法はforループでした。 ascii octals
65-91およびPHPのchr()
関数を使用します。これを行うためのより簡単で効率的な方法があるのかと疑問に思っていました。PHPのrange()
関数はアルファベットの範囲をサポートしています。PHPの範囲( 'A'、 'Z')は静的配列を返しますか?
私は別の方法を比較するために、私のテストコードを書いた後、いくつかの質問が頭に浮かんだ:
- んPHPは、アルファベットの静的な配列を格納しますか?
- どのようにしてPHP層の下を見てより深くプロファイルすると、 何が起こっているのですか?
環境設定に加えて、必要に応じて添付できるPHPスクリプトのキャッシュグリードを持っています。
ルート@の仕事箱::〜$ lshw http://pastebin.com/cZZRjJcR
ルート@の仕事箱:〜$ のsysinfo、それを実行したマシンのスペックを知りたいかもしれない人のために、ここでいくつかのリンクですhttp://pastebin.com/ihQkkPAJ
<?php
/*
* determine which method out of 3 for returning
* an array of uppercase alphabetic characters
* has the highest performance
*
* +++++++++++++++++++++++++++++++++++++++++++++
*
* 1) Array $alpha = for($x = 65; $x < 91; $x++) { $upperChr[] = chr($x); }
* 2) Array $alpha = range(chr(65), chr(90);
* 3) Array $alpha = range('A', 'Z');
*
* +++++++++++++++++++++++++++++++++++++++++++++
*
* test runs with iterations:
*
* 10,000:
* - 1) upperChrElapsed: 0.453785s
* - 2) upperRangeChrElapsed: 0.069262s
* - 3) upperRangeAZElapsed: 0.046110s
*
* 100,000:
* - 1) upperChrElapsed: 0.729015s
* - 2) upperRangeChrElapsed: 0.078652s
* - 3) upperRangeAZElapsed: 0.052071s
*
* 1,000,000:
* - 1) upperChrElapsed: 50.942950s
* - 2) upperRangeChrElapsed: 10.091785s
* - 3) upperRangeAZElapsed: 8.073058s
*/
ini_set('max_execution_time', 0);
ini_set('memory_limit', 0);
define('ITERATIONS', 1000000); // 1m loops x3
$upperChrStart = microtime(true);
for($i = 0; $i <= ITERATIONS; $i++) {
$upperChr = array();
for($x = 65; $x < 91; $x++) {
$upperChr[] = chr($x);
}
}
$upperChrElapsed = microtime(true) - $upperChrStart;
// +++++++++++++++++++++++++++++++++++++++++++++
$upperRangeChrStart = microtime(true);
for($i = 0; $i <= ITERATIONS; $i++) {
$upperRangeChr = range(chr(65), chr(90));
}
$upperRangeChrElapsed = microtime(true) - $upperRangeChrStart;
// +++++++++++++++++++++++++++++++++++++++++++++
$upperRangeAZStart = microtime(true);
for($i = 0; $i <= ITERATIONS; $i++) {
$upperRangeAZ = range('A', 'Z');
}
$upperRangeAZElapsed = microtime(true) - $upperRangeAZStart;
printf("upperChrElapsed: %f\n", $upperChrElapsed);
printf("upperRangeChrElapsed: %f\n", $upperRangeChrElapsed);
printf("upperRangeAZElapsed: %f\n", $upperRangeAZElapsed);
?>
を私はあなたのことは知らないが、私は、余分な2マイクロ秒は最低で私を心配していたことがありません。これは私のPHPの主な問題です。言語そのものではなく、役に立たないことのベンチマークを主張するライザーです。とにかくループしてはならない何百万回の反復は、余分に2秒かかる!ああgn0! pfft – cHao
@cHao自分で話してください。アプリケーションのメインループに2マイクロ秒追加すると、データセンターごとに購入する必要があるハードウェアの追加で$ 3,000がかかります。内部ループで2マイクロ秒であれば、より多くのコストがかかります。 – Crashworks
@クラッシュワークス:もし速度の差がそれほどお金にならないのならば、率直に言って、PHPを使うべきではありません。あなたは代わりにC++(あるいは(C#))を使うことができ、何百万ドルも節約できます。もちろん、ここでの実際の最適化(同じ配列で作成したばかりのものをループから移動する)は自由です。ポイントは、最速の2つの間の速度の差はごくわずかであり、アルゴリズムを改善することによって速度の問題を改善することは、アレイをより速く作成することよりもよい。 – cHao