2009-07-15 3 views
3

私はPHPアプリケーションで特定の関数を最適化しようとしていますが、愚かに 'if'ステートメントのブールルックアップが文字列比較よりも速いと仮定しています。しかし、私はそれを確認するために、microtimeを使って短いテスト(下記参照)をまとめました。私の驚いたことに、文字列の検索は速かったです。PHP文字列とブーリアンスピードテスト

私のテストで何か問題がありますか(あまりにも多くのコーヒーを入れているので自分のコードが不審です)?もしそうでなければ、私はPHPで文字列とブール値のルックアップについて人々が持っているコメントに興味があります。

最初のテスト(ブールルックアップ)の結果は0.168秒でした。

2番目のテスト(文字列検索)の結果は0.005秒でした。

<?php 
    $how_many = 1000000; 
    $counter1 = 0; 
    $counter2 = 0; 

    $abc = array('boolean_lookup'=>TRUE, 'string_lookup'=>'something_else'); 

    $start = microtime(); 
    for ($i = 0; $i < $how_many; $i++) 
    { 
     if ($abc['boolean_lookup']) 
     { 
      $counter1++; 
     } 
    } 

    echo ($start - microtime()); 

    echo '<hr>'; 

    $start = microtime(); 
    for ($i = 0; $i < $how_many; $i++) 
    { 
     if ($abc['string_lookup'] == 'something_else') 
     { 
      $counter2++; 
     } 
    } 

    echo ($start - microtime()); 
+1

はあなたが望んでいないだろうがtrueまたはfalseを返すに差がある場合、私はチェックアウトするかもしれないいくつかの他の日microtime()を使用するには - $ start? $ start-microtime()は負でなければなりません。 – BaroqueBobcat

答えて

6

はい、あなたはあまりにも多くのコーヒーを持っていました。 microtime(true)を使用する必要があります。そうでなければ、日付計算はミリ秒で動作しますが、秒は完全に無視されます。継続時間を計測する開始時間、ない開始時間を - - 現在の時刻あなたが負の時間を取得したり、他に、また、現在の時刻を使用しています。代わりに次のコードを試してください。

<?php 

$how_many = 5000000; 
$counter1 = 0; 
$counter2 = 0; 

$abc = array('boolean_lookup'=>TRUE, 'string_lookup'=>'something_else'); 

$start = microtime(true); 
for($i = 0; $i < $how_many; $i++) 
{ 
    if($abc['boolean_lookup']) 
    { 
     $counter1++; 
    } 

} 

echo "FIRST: ", (microtime(true) - $start), "\n"; 

$start = microtime(true); 
for($i = 0; $i < $how_many; $i++) 
{ 
    if($abc['string_lookup'] == 'something_else') 
    { 
     $counter2++; 
    } 

} 

echo "SECOND: ", (microtime(true) - $start), "\n"; 
+1

ありがとう!私はコーヒーを休みます:) –

0

boolの比較を少し調整したい場合があります。

if($ var)はブール比較ではありません(「文字列比較」と比較して)。

if($abc['boolean_lookup'] == TRUE)またはif($abc['boolean_lookup'] === TRUE)(2対3の等号)で再度試してみてください。

私はブール比較を含むテストを行い、3イコールサインの比較も同様に行いました。 さらに、ループを3回実行するループもあります。結果はさまざまな外部要因によって異なる場合があります。

スクリプトexcutionの合計時間がかなり長いので、私は$how_many = 5000000;ここ

$how_many = 3000000;にしlowereedてきたこの方法は、最終的なスクリプトです:

<?php 
function DoTest(){ 

    $how_many = 3000000; 
    $counter1 = 0; 
    $counter2 = 0; 
    $counter3 = 0; 
    $counter4 = 0; 
    $counter5 = 0; 
    $counter6 = 0; 

    $abc = array('boolean_lookup'=>TRUE, 'string_lookup'=>'something_else'); 

    $start = microtime(true); 
    for($i = 0; $i < $how_many; $i++){ 
     if($abc['boolean_lookup']){ 
      $counter1++; 
     } 

    } 
    echo "GENERAL-IF ON A BOOL: ", (microtime(true) - $start)*10, "<br />\n"; 

    $start = microtime(true); 
    for($i = 0; $i < $how_many; $i++){ 
     if($abc['string_lookup']){ 
      $counter2++; 
     } 

    } 
    echo "GENERAL-IF ON A STRING: ", (microtime(true) - $start)*10, "<br />\n"; 

    $start = microtime(true); 
    for($i = 0; $i < $how_many; $i++){ 
     if($abc['boolean_lookup'] == TRUE){ 
      $counter3++; 
     } 

    } 
    echo "TWO-EQUALL-IF ON A BOOL : ", (microtime(true) - $start)*10, "<br />\n"; 

    $start = microtime(true); 
    for($i = 0; $i < $how_many; $i++){ 
     if($abc['string_lookup'] == 'something_else'){ 
      $counter4++; 
     } 

    } 
    echo "TWO-EQUALL-IF ON A STRING : ", (microtime(true) - $start)*10, "<br />\n"; 

    $start = microtime(true); 
    for($i = 0; $i < $how_many; $i++){ 
     if($abc['boolean_lookup'] === TRUE){ 
      $counter5++; 
     } 

    } 
    echo "THREE-EQUALL-IF ON A BOOL : ", (microtime(true) - $start)*10, "<br />\n"; 

    $start = microtime(true); 
    for($i = 0; $i < $how_many; $i++){ 
     if($abc['string_lookup'] === 'something_else'){ 
      $counter6++; 
     } 

    } 
    echo "THREE-EQUALL-IF ON A STRING : ", (microtime(true) - $start)*10, "<br />\n"; 

} 

$number_of_tests = 3; 
for($i = 0; $i < $number_of_tests; $i++){ 
    echo "<br />\n<br />\n== Test #".($i+1)."<br />\n"; 
    DoTest(); 
} 
?> 

と結果:

== Test #1 
GENERAL-IF ON A BOOL: 7.61245965958 
GENERAL-IF ON A STRING: 7.49043941498 
TWO-EQUALL-IF ON A BOOL : 8.92991065979 
TWO-EQUALL-IF ON A STRING : 10.3996396065 
THREE-EQUALL-IF ON A BOOL : 8.02039146423 
THREE-EQUALL-IF ON A STRING : 9.25590991974 


== Test #2 
GENERAL-IF ON A BOOL: 7.74684906006 
GENERAL-IF ON A STRING: 7.58201122284 
TWO-EQUALL-IF ON A BOOL : 8.90240907669 
TWO-EQUALL-IF ON A STRING : 10.2967596054 
THREE-EQUALL-IF ON A BOOL : 8.08442115784 
THREE-EQUALL-IF ON A STRING : 9.2577290535 


== Test #3 
GENERAL-IF ON A BOOL: 7.63362884521 
GENERAL-IF ON A STRING: 7.5103187561 
TWO-EQUALL-IF ON A BOOL : 8.92127037048 
TWO-EQUALL-IF ON A STRING : 10.4210495949 
THREE-EQUALL-IF ON A BOOL : 8.02319049835 
THREE-EQUALL-IF ON A STRING : 9.25379991531 

私の結論は、比較(等号付き)を実行すると、ブールが勝者であることに疑いはありません。

しかし、単純な一般的なif() - 文を実行すると、文字列はboolより早く返されます。

(すなわち。それは反対のことを検出するための時間がかかるのでしょうか?)

挨拶、 Krinkle