Тест строки PHP и булева скорость - PullRequest
3 голосов
/ 15 июля 2009

Я смотрю на попытку оптимизировать определенную функцию в приложении PHP и глупо предположил, что логический поиск в операторе 'if' будет быстрее сравнения строк Но чтобы проверить это, я собрал короткий тест (см. Ниже), используя microtime . К моему удивлению, поиск строки был быстрее.

Что-то не так с моим тестом (у меня слишком много кофе, поэтому я с подозрением отношусь к своему коду)? Если нет, то я был бы заинтересован в любых комментариях, которые люди имеют в отношении поиска строк или логических поисков в PHP.

Результат первого теста (логический поиск) составил 0,168 секунды.

Результат для второго теста (поиск строки) составил 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());

Ответы [ 2 ]

6 голосов
/ 15 июля 2009

Да, вы выпили слишком много кофе. Вам нужно использовать 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";
0 голосов
/ 17 апреля 2010

Возможно, вы захотите немного изменить сравнение bool.

Выполнение общего условия, если ($ var) не является логическим сравнением (по сравнению с "сравнением строк").

Попробуйте еще раз, набрав if($abc['boolean_lookup'] == TRUE) или if($abc['boolean_lookup'] === TRUE) (2 или 3 знака равенства).

Я сделал тест, включающий сравнение bool, а также сравнение трех равных знаков. И дополнительно цикл, чтобы сделать это 3 раза, так как результаты могут отличаться от ряда внешних факторов.

Так как общее время выполнения сценария достаточно велико, я уменьшил число $how_many = 5000000; до $how_many = 3000000;

Вот последний скрипт:

<?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.

Как-нибудь в другой день я мог бы проверить, есть ли разница в возврате true или false (т. Е. Требуется ли больше времени для обнаружения противоположного?)

Привет, Krinkle

...