Я использовал указатель функции, p
, для вызова различных функций. Моя проблема в том, что производительность вызова p
резко снижается, если я указываю на другую функцию после того, как ей уже была назначена функция. Производительность хороша, если я переключаю p
между undefined
и той же функцией снова и снова, и хороша, когда я указываю только одну функцию, но переключение между функциями снижает производительность.
Ниже приведен код, который я использую для проверки этого сценария, а здесь - скрипка . Я рекурсивно повторяю 500 раз и вызываю p
1 000 000 раз в каждом цикле. p
может быть undefined
или указывать на func1
или func2
.
function func1() {} // two identical empty functions
function func2() {} // different in name only
var p = func1; // default to func1
var count = 0; // current loop
var elapse = 0; // elapsed time for 1,000,000 calls on each loop
var start = 0; // start time for 1,000,000 calls on each loop
var total = 0; // total elapsed time for all loops
function loop() {
start = performance.now(); // get start time
for (let i = 0; i < 1000000; i ++) if (p !== undefined) p(); // do 1,000,000 calls or early out 1,000,000 times if undefined
elapse = performance.now() - start;
total += elapse; // used for getting average
count ++;
console.log(p + "\nelapsed " + elapse + "\naverage " + total / count);
// Switch between the lines below to see the performance difference.
p = (p === func1) ? p = undefined : p = func1; // best performance
//p = (p === func1) ? p = func1 : p = func1; // good performance
//p = (p === func1) ? p = func2 : p = func1; // bad performance
// pattern: func1 -> undefined -> func2 -> undefined -> repeat
/*if (p === undefined) p = (count % 4 === 0) ? p = func1 : p = func2;
else p = undefined;*/ // also bad performance
if (count < 500) loop(); // start the next loop
}
console.clear();
loop(); // start the loop
Почему производительность вызова p
значительно падает, когда ему назначается другая функция? Кроме того, почему установка p
на undefined
и возврат к исходной функции не изменяет производительность, если настройка p
на undefined
, а затем на другую функцию?