我正在阅读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次电话= 900ms
由于某些原因,这比重新运行函数定义(第一个代码部分)慢。
我有几十个我正在调用的javascript文件和函数,所有这些都是在200ms内使用第一个代码示例运行的。为已经定义的函数名添加缓存并且不再重新定义它们之后,完全相同的代码的运行时间大约为900毫秒。
要验证丢失的重新定义是性能损失的唯一原因,我更改了if:
if ( !isset($this->cache[$filename]) || true ) {
...将函数名称保存到数组中,不包括php-array作为可能的问题。
大的性能损失来自何处或如何进一步调试?
答案 0 :(得分: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)