Memoizationのテクニックを使用できます。
Memoizationは、以前に計算された結果をキャッシュすることによって機能のパフォーマンスを向上させるプログラミング手法です。
基本的な考え方は、空のObjectを作成してから、Keysをハッシュ値または引数値として追加し、Objectキーで既に使用可能な引数を取得した場合は、Object値を返しますキー。
以下の機能にいくつかのバリエーションがありますが、これは他の実装よりもはるかに優れています。 Addy Osmaniの記事hereから抜粋したコードスニペット。
function memoize(fn) {
return function() {
var args = Array.prototype.slice.call(arguments),
hash = "",
i = args.length;
currentArg = null;
while (i--) {
currentArg = args[i];
hash += (currentArg === Object(currentArg)) ?
JSON.stringify(currentArg) : currentArg;
fn.memoize || (fn.memoize = {});
}
return (hash in fn.memoize) ? fn.memoize[hash] :
fn.memoize[hash] = fn.apply(this, args);
};
}
用途:
var cachedIsPrime = memoize(isPrime);
var isPrime = cachedIsPrime(2);
isPrime = cachedIsPrime(3);
そしてあなたがメモ化する必要のある関数を渡すことができます。
OP注:単一の引数と上記の文脈のために 、次のような単純なmemoize機能は、作業を行います。あなたは、パフォーマンスを気にしている場合、あなたはまた、使用を検討する必要があること
var memoize = function(passedFunc) {
var cache = {};
return function(x) {
if (x in cache) return cache[x];
return cache[x] = passedFunc(x);
};
};
注意ループのヘッダーから 'Math.sqrt()'コールを取る*以上のものが必要です。とにかく、seiveは効果的にキャッシュの目的に役立ちます。 – Pointy
seiveはキャッシュの目的としてどのように機能しますか? – nashcheez
セイバー*はすべての数値のマップ(計算量の限度まで)であり、その数値が素数かどうかを示すフラグです。 – Pointy