JavaScript:memoizeグローバル関数


基本概念

  • 簡単に言えば、関数の計算結果をキャッシュします.これは計算量の大きい再帰呼び出しに対して,速度を速めることができる.例えば階乗、フィボナッチ配列配列などです.
  • の1回目の計算は、キャッシュがないため、時間がかかります.2回目からは、計算せずにキャッシュから結果を直接取ることができ、スピードが速い.
  • 再帰関数では、中間プロセスではなく最終結果がキャッシュされます.例えば10の階乗を計算し,最終的に10の階乗の結果をキャッシュする.中間プロシージャ1~9の乗算結果はキャッシュされません.つまり10の階乗を呼び出してから9の階乗を呼び出すのは、初めての計算です.

  • インプリメンテーションコード


    ファイル名:memoize.js
    const memoize = function(fn) {
        const cache = {};
        return function() {
            const key = JSON.stringify(arguments);
            var value = cache[key];
            if(!value) {
                console.log('  ,   ...');         //          log,        
                value = [fn.apply(this, arguments)];  //        ,    undefined,null     
                cache[key] = value;
            } else {
                console.log('    ');               //          log,        
            }
            return value[0];
        }
    }
    
    module.exports = memoize;
    

    テストコード


    ファイル名:memoize_test.js
    const memoize = require('./memoize.js');
    const log = console.log;
    
    //       
    const fibonacci = (n) => {
        return n < 2 
            ? n
            : fibonacci(n - 1) + fibonacci(n - 2);
    };
    
    const memoizeFibonacci = memoize(fibonacci);
    
    log(memoizeFibonacci(45));   //   ,   ...;    1134903170  //        
    log(memoizeFibonacci(45));   //     ;    1134903170
    log(memoizeFibonacci(45));   //     ;    1134903170
    log(memoizeFibonacci(45));   //     ;    1134903170
    log(memoizeFibonacci(45));   //     ;    1134903170
    

    参考記事


    js Memoization最適化運転速度
    Javascript Memoizerの概要
    転載:https://www.jianshu.com/p/4756fbe61a63