Странные результаты скорости для запомненной функции Фибоначчи в 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 из подготовительного кода в тестовый код или очистить кэш функций в тестовом коде.

Другие вопросы по тегам