2012-02-18 10 views
3

私は、製品ページでA-Zナビゲーションを生成するために書いたコードを見落としていましたが、その方法はforループでした。 ascii octals 65-91およびPHPのchr()関数を使用します。これを行うためのより簡単で効率的な方法があるのか​​と疑問に思っていました。PHPのrange()関数はアルファベットの範囲をサポートしています。PHPの範囲( 'A'、 'Z')は静的配列を返しますか?

私は別の方法を比較するために、私のテストコードを書いた後、いくつかの質問が頭に浮かんだ:

  1. んPHPは、アルファベットの静的な配列を格納しますか?
  2. どのようにして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); 

?> 
+0

を私はあなたのことは知らないが、私は、余分な2マイクロ秒は最低で私を心配していたことがありません。これは私のPHPの主な問題です。言語そのものではなく、役に立たないことのベンチマークを主張するライザーです。とにかくループしてはならない何百万回の反復は、余分に2秒かかる!ああgn0! pfft – cHao

+1

@cHao自分で話してください。アプリケーションのメインループに2マイクロ秒追加すると、データセンターごとに購入する必要があるハードウェアの追加で$ 3,000がかかります。内部ループで2マイクロ秒であれば、より多くのコストがかかります。 – Crashworks

+0

@クラッシュワークス:もし速度の差がそれほどお金にならないのならば、率直に言って、PHPを使うべきではありません。あなたは代わりにC++(あるいは(C#))を使うことができ、何百万ドルも節約できます。もちろん、ここでの実際の最適化(同じ配列で作成したばかりのものをループから移動する)は自由です。ポイントは、最速の2つの間の速度の差はごくわずかであり、アルゴリズムを改善することによって速度の問題を改善することは、アレイをより速く作成することよりもよい。 – cHao

答えて

2

PHPは文字の配列を保持していますか?私はそれを疑うだろう。 range()は多種多様な値に対しても機能します。

このような場合にパフォーマンスが問題になる場合は、再利用できるようにループ外に配列を宣言することができます。しかし、大きな利益はめったにマイクロ最適化に由来しません。大規模なアプリケーションでプロファイリングを使用すると、大幅な利益を得ることができます。

低レベルのプロファイリングでは、PHP CLIでvalgrindを使用するだけで済みます。私はまた、それがApacheのプロセスで使用されていることを見てきました。

関連:How to profile my C++ application on linux

関連する問題