Boolean hız testi karşı PHP string

2 Cevap php

Ben bir PHP uygulama belirli bir fonksiyonu optimize etmek için çalışıyor bakıyor ve aptalca bir boolean arama, bir deyim, bir dize daha hızlı olacaktır 'eğer karşılaştırmak farz ediyorum. Ama bunu kontrol etmek ben birlikte microtime kullanarak kısa bir test (aşağıya bakınız) koymak. Benim için sürpriz, dize arama daha hızlı oldu.

Benim test ile yanlış bir şey (ben çok fazla kahve bağlıyım, bu yüzden benim kendi kod şüpheli değilim) var mı? Eğer değilse, ben insanların PHP Boole aramalarını karşı dize etrafında herhangi bir yorum ilgi olacaktır.

Ilk testi (boolean arama) için sonuç 0.168 saniye idi.

Ikinci test (string arama) için sonuç 0.005 saniye idi.

<?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());

2 Cevap

Evet, çok fazla kahve yaşadım. Aksi takdirde tarih hesaplamaları milisaniye üzerinde çalışan ama tamamen saniye görmezden microtime(true) kullanmanız gerekir. Ayrıca, kullanmak current time - start time, süresini ölçmek değil start time için - current time, ya da başka olumsuz bir zaman olsun. Yerine aşağıdaki kodu deneyin:

<?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";

Sen bool karşılaştırmalarda biraz ayarlamak isteyebilirsiniz.

($ Var) ("dize karşılaştırma" ile karşılaştırıldığında) bir bool karşılaştırma değilse bir general yapıyor.

if($abc['boolean_lookup'] == TRUE) veya if($abc['boolean_lookup'] === TRUE) ile tekrar testi deneyin (2 vs 3 eşittir işareti).

I made a test including the bool comparision, and the three-equals signs comparisions aswell. And additionally a loop to do it 3 times, as the results may vary on a number of external factors.

Komut excution toplam süresi oldukça uzun ben $how_many = 5000000; için $how_many = 3000000; lowereed ettik bu yoldur yana

İşte son yazısıdır:

<?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();
}
?>

Ve sonuç:

== 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

Yani, benim sonuç (eşittir işareti ile) karSIlaStIrmasInI yaparken bool kazanan, şüphesiz olmasıdır.

Ancak, basit bir düz genel yaparken dize bool sonra önceki döndürür () deyimi eğer.

Dönen bir fark olup olmadığını başka bir gün ben kontrol edebilirsiniz doğru veya yanlış (yani o tam tersini algılamak için daha uzun sürer?)

Greetings, Krinkle