Я читаю файлы javascript в php и выполняю их, используя 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 вызовов = 900 мс
По некоторым причинам это медленнее, чем повторное выполнение определения функции (первая часть кода).
У меня есть несколько десятков javascript-файлов и функций, которые я вызываю, и все они работали в течение 200 мс, используя первый пример кода. После добавления кэширования для уже определенных имен функций и их повторного определения время выполнения для точно такого же кода составило около 900 мс.
Чтобы убедиться, что пропущенное переопределение является единственной причиной потери производительности, я изменил if:
if ( !isset($this->cache[$filename]) || true ) {
… сохраняя имя функции в массиве, исключая php-массив как возможную проблему.
Откуда происходит большая потеря производительности или как я могу отладить это дальше?