MugeSoの日記 このページをアンテナに追加 RSSフィード

2008-09-10

[][]ifとswitchどっちがはやいねん(文字列比較)

ということでベンチとった。

<?php
require_once 'Benchmark/Timer.php';

function useSwitch($value) {
    $a = 0;
    switch($value) {
    case 'foo':
        $a = 2;
        break;
    case 'bar':
        $a = 3;
        break;
    case 'baz':
        $a = 4;
        break;
    default:
        $a = 5;
    }
}

function useIf($value) {
    $a = 0;
    if($value == 'foo') {
        $a = 2;
    } elseif($value == 'bar') {
        $a = 3;
    } elseif($value == 'baz') {
        $a = 4;
    } else {
        $a = 5;
    }}
function useIfType($value) {
    $a = 0;
    if($value === 'foo') {
        $a = 2;
    } elseif($value === 'bar') {
        $a = 3;
    } elseif($value === 'baz') {
        $a = 4;
    } else {
        $a = 5;
    }
}
$target_functions = array('useSwitch', 'useIf', 'useIfType');
$target_arguments = array('foo', 'bar', 'baz', 'something');

$timer = new Benchmark_Timer();

$timer->start();
foreach($target_functions AS $func) {
    foreach($target_arguments AS $arg) {
        //$timer->setMarker("$func('$arg') before");                                                                 
        for($i= 0; $i<10000; $i++) $func($arg);                                                                      
        $timer->setMarker("$func('$arg')");
    }
}

$timer->stop(); 
$timer->display();

$aに数値代入しているのは何となく、なんか処理入れといたほうがいいかなーと思ったから。

自宅サーバのPHP5.2の結果。

---------------------------------------------------------------------
marker                   time index            ex time         perct   
---------------------------------------------------------------------
Start                    1221013617.78282700   -                0.00%
---------------------------------------------------------------------
useSwitch('foo')         1221013617.84077700   0.057950         8.26%
---------------------------------------------------------------------
useSwitch('bar')         1221013617.90401800   0.063241         9.02%
---------------------------------------------------------------------
useSwitch('baz')         1221013617.97475400   0.070736        10.09%
---------------------------------------------------------------------
useSwitch('something')   1221013618.04148700   0.066733         9.52%
---------------------------------------------------------------------
useIf('foo')             1221013618.09349300   0.052006         7.42%
---------------------------------------------------------------------
useIf('bar')             1221013618.15141800   0.057925         8.26%
---------------------------------------------------------------------
useIf('baz')             1221013618.21601200   0.064594         9.21%
---------------------------------------------------------------------
useIf('something')       1221013618.27801400   0.062002         8.84%
---------------------------------------------------------------------
useIfType('foo')         1221013618.32627600   0.048262         6.88%
---------------------------------------------------------------------
useIfType('bar')         1221013618.37754300   0.051267         7.31%
---------------------------------------------------------------------
useIfType('baz')         1221013618.43264300   0.055100         7.86%
---------------------------------------------------------------------
useIfType('something')   1221013618.48394000   0.051297         7.32%
---------------------------------------------------------------------
Stop                     1221013618.48402100   0.000081         0.01%
---------------------------------------------------------------------
total                    -                     0.701194       100.00%
---------------------------------------------------------------------

ifのが早いのね。そして、どうせ文字列比較するなら===使っとけということですね。

2008-06-23

[][]とりあえずベンチ

via: 問. 配列を+(プラス)演算子で加算すると? : アシアルブログ

[senna@vine senna]$ time php -r '$a = range(0,10); $b = range(0, 10); for($i=0; $i<1000000; $i++) $c = array_merge($b, $a);'

real    0m24.783s
user    0m23.270s
sys     0m0.030s
[senna@vine senna]$ time php -r '$a = range(0,10); $b = range(0, 10); for($i=0; $i<1000000; $i++) $c = $a + $b;'

real    0m5.993s
user    0m5.990s
sys     0m0.000s

2008-04-29

[][]strpos($str, $token) === 0と$str[0]===$token

FormPopulationFilterを眺めてたらstrpos($action, '/')===0とかいう記述があったのでこれも含めて再度ベンチマークをとってみた。前回より微妙に早くなってるのは$tokenも先に定義してるので""のパース時間が短縮されたおかげだと思います。

[senna@vine senna]$ time php -r '$str="abbbb"; $token="a"; for($i=0; $i < 1000000; $i++){ $str[0] === $token;}'

real    0m1.617s
user    0m1.610s
sys     0m0.010s
[senna@vine senna]$ time php -r '$str="abbbb"; $token="a"; for($i=0; $i < 1000000; $i++){ strpos($str, $token)===0;}'

real    0m2.174s
user    0m2.170s
sys     0m0.000s
[senna@vine senna]$ time php -r '$str="abbbb"; $token="a"; for($i=0; $i < 1000000; $i++){ substr($str, 0)===$token;}'

real    0m2.466s
user    0m2.460s
sys     0m0.010s
[senna@vine senna]$ time php -r '$str="abbbb"; $token="a"; for($i=0; $i < 1000000; $i++){;}'

real    0m0.682s
user    0m0.670s
sys     0m0.010s

ということで、一文字目がある決まった文字であるかを判別するには$str[0]===$tokenを用いましょう。

2008-04-27

[][]substr($str, $n, 1)と$str[$n]のベンチマーク

AgaviDependencyManager::checkDependenciesをみてたらsubstr($token, 0, 1)とかしてたので、念のためベンチマークとってみた。

環境はPHP5.2.2

[senna@vine senna]$ time php -r '$str="aaaaa"; for($i=0; $i < 1000000; $i++){ substr($str, 0, 1) == "a";}'

real    0m3.345s
user    0m3.320s
sys     0m0.020s
[senna@vine senna]$ time php -r '$str="aaaaa"; for($i=0; $i < 1000000; $i++){ $str[0] == "a";}'

real    0m2.012s
user    0m1.990s
sys     0m0.020s

[senna@vine senna]$ time php -r '$str="aaaaa"; for($i=0; $i < 1000000; $i++){ $str[0];}'

real    0m0.853s
user    0m0.850s
sys     0m0.010s
[senna@vine senna]$ time php -r '$str="aaaaa"; for($i=0; $i < 1000000; $i++){ substr($str, 0, 1);}'

real    0m2.585s
user    0m2.570s
sys     0m0.010s