Странные результаты скорости для запомненной функции Фибоначчи в Javascript
Я собрал простой пример запоминания и провел несколько тестов производительности, но не понимаю, почему в Chrome memTestHalfAssed
самый быстрый, хотя fibonacciH
звонки внутри не запоминаются. Тесты на http://jsperf.com/moize-test
function fibonacci(n) {
return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
}
Function.prototype.memoized = function(a) {
if (typeof this.cache === "undefined") this.cache = [];
if (this.cache[a]) {
return this.cache[a];
} else {
this.cache[a] = this(a);
return this.cache[a];
}
}
Function.prototype.memoize=function() {
var t=this;
return function() {
return t.memoized.apply(t,arguments);
//return t.memoized(arguments[0]);
}
}
memTest= (function fibonacciM(n) {
return n < 2 ? n : fibonacciM.memoized(n - 1) + fibonacciM.memoized(n - 2);
}).memoize();
memTestHalfAssed = (function fibonacciH(n) {
return n < 2 ? n : fibonacciH(n - 1) + fibonacciH(n - 2);
}).memoize();
РЕДАКТИРОВАТЬ:
Я обновил тесты Revision 1 согласно ответу Гаффы, и теперь, похоже, это имеет больше смысла.
1 ответ
Я не уверен, почему memTestHalfAsses
быстрее в Chrome, но это может быть некоторая оптимизация, которая идет не так в доступе к кешу. Другие браузеры не показывают эту разницу.
Тест на самом деле не измеряет разницу между реализациями, а только показывает, насколько хорошо работает кеш, когда значение уже находится в кеше. Тестовый код будет запущен миллионы раз, и только в первый раз выполнение будет отличаться. После этого оба memTest
а также memTestHalfAssed
оба сразу вернут кэшированное значение.
Чтобы увидеть разницу между ними, вам нужно переместить создание memTest
а также memTextHalfAssed
из подготовительного кода в тестовый код или очистить кэш функций в тестовом коде.