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