2012-01-27 82 views
2

我正在閱讀php中的javascript文件並使用v8js執行它們。爲什麼函數重定義比調用第一個更快?

簡化的例子:

$javascriptCode = file_get_contents($filename); 
$funcName = 'func'.md5($filename); 
$v8js->executeString(" 
function {$funcName}() { 
    {$javascriptCode} 
}"); 
$v8js->executeString("var testVariable = {$funcName}();"); 

〜50個呼叫= 200毫秒

爲了提高性能我減少後續調用僅當函數已經定義調用函數名:

if (!isset($this->cache[$filename])) { 
$javascriptCode = file_get_contents($filename); 
$funcName = 'func'.md5($filename); 
$v8js->executeString(" 
    function {$funcName}() { 
    {$javascriptCode} 
    }"); 
    $this->cache[$filename] = $funcName; 
} 
else { 
$funcName = $this->cache[$filename]; 
} 
$v8js->executeString("var testVariable = {$funcName}();"); 

〜50個電話= 900ms

由於某些原因,這比重新運行函數定義(第一個代碼部分)要慢。

我有幾十個JavaScript文件和函數,我打電話,所有在200毫秒內使用第一個代碼示例運行。爲已定義的函數名添加緩存並不再重新定義它們之後,完全相同代碼的運行時間大約爲900毫秒。

要驗證缺少重新定義對於業績虧損的唯一原因,我改變了,如果:

if (!isset($this->cache[$filename]) || true) { 

...具有該功能的名稱仍然被保存到數組中,不包括PHP-陣列一個可能的問題。

大的性能損失來自哪裏,或者如何進一步調試?

回答

1

我創建了幾個測試來進一步識別所有內容,最後找到隱藏在我自己的JavaScript代碼深處的原因。

即使該代碼是相同的,在JavaScript一些if決定側身製成一切較慢:-)

這裏是源代碼,以最後一次測試我確實已表明,如果沒有重新定義它是更快就像有人預計:

<?php 
$runList = array(10, 100, 1000, 10000, 100000); 
$jsFunc = 'function myTestFunc() { return {foo: "bar"}; } '; 
foreach ($runList as $runs) { 

    $start = mstime(); 
    $js = new V8Js('Test'); 
    for ($i = $runs; $i > 0; $i--) { 
     $js->executeString($jsFunc, 'Test.Context'); 
     $js->executeString("myTestFunc();", 'Test.Context'); 
    } 
    echo "#1: " . (mstime() - $start)." ({$runs} with re-definition)<br />"; 
    unset($js); 

    $start = mstime(); 
    $js = new V8Js('Test'); 
    $js->executeString($jsFunc, 'Test.Context'); 
    for ($i = $runs; $i > 0; $i--) { 
     $js->executeString("myTestFunc();", 'Test.Context'); 
    } 
    echo "#2: " . (mstime() - $start)." ({$runs} without re-definition)<br />"; 
    unset($js); 
    echo "<hr />"; 
} 

function mstime() { 
    list($usec, $sec) = explode(" ", microtime()); 
    return ((float)$usec + (float)$sec); 
} 

結果:

#1: 0.000640869140625 (10 with re-definition) 
#2: 0.0003800392150878906 (10 without re-definition) 
#1: 0.001749992370605469 (100 with re-definition) 
#2: 0.0009560585021972656 (100 without re-definition) 
#1: 0.01554703712463379 (1000 with re-definition) 
#2: 0.04881501197814941 (1000 without re-definition) 
#1: 0.503957986831665 (10000 with re-definition) 
#2: 0.1761679649353027 (10000 without re-definition) 
#1: 4.813416957855225 (100000 with re-definition) 
#2: 1.93553900718689 (100000 without re-definition) 
相關問題