2012-01-27 4 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のコール= 200msの

パフォーマンスを向上させるために、私は、関数がすでに定義されている場合のみ、関数名をコールする後続の呼び出しを削減:

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 calls = 900ms

何らかの理由で、これは関数定義(最初のコード部分)を再実行するよりも時間がかかります。

私は最初のコード例を使用して200ms以内に実行されたjavascriptファイルと関数をいくつも持っています。すでに定義されている関数名のキャッシングを追加し、それらを再定義しなくても、まったく同じコードのランタイムは約900msでした。関数名は依然としてとしてのphp-配列を除いて、配列に保存されていた...

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

:行方不明の再定義が、私は場合を変更し、パフォーマンス低下のための唯一の理由であることを確認するには

考えられる問題。

大きなパフォーマンスの低下はどこから発生しますか、これをさらにどのようにデバッグすることができますか?

答えて

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) 
関連する問題