不使用全局变量的Javascript缓存
我试图优化函数的使用,以检查数字是否为素数 我编写了以下函数:不使用全局变量的Javascript缓存,javascript,Javascript,我试图优化函数的使用,以检查数字是否为素数 我编写了以下函数: function isPrime(num) { var start = 2; // code to check whether num has already been checked for Prime while(start <= Math.sqrt(num)) { if (num % start++ < 1) { return false; }
function isPrime(num) {
var start = 2;
// code to check whether num has already been checked for Prime
while(start <= Math.sqrt(num)) {
if (num % start++ < 1) {
return false;
}
}
return num > 1;
}
函数isPrime(num){
var启动=2;
//用于检查是否已为素数检查num的代码
同时(开始1;
}
但是,在执行while
循环之前,我想检查一个数字是否已经通过isPrime函数传递,这样我就可以返回它是否为prime,而不必执行while
循环
请注意,我希望在不使用全局变量或不扩展
对象的情况下执行此操作。prototype
您要查找的是记忆模式
发件人:
在计算中,记忆是一种优化技术
主要用于通过存储计算结果来加速计算机程序
昂贵的函数调用,并在相同的情况下返回缓存结果
输入再次出现
您可以编写(如其他答案所示)或使用npm上提供的许多优化的和经过良好测试的实现中的一种,如或。如果您已经使用Lodash,它也有自己的功能
例如:
var isPrime = memoize(/* your function */)
isPrime(2) // => true
isPrime(2) // => true (from the cache)
在中声明变量以创建
checked\u numbers
在返回的isPrime
函数的范围内(由于它(函数本身)被分配给了一个全局变量,所以在IIFE之外可以访问该函数),但IIFE之外的任何东西都不能触及它。您可以使用记忆技术
记忆是一种编程技术,它试图通过缓存以前计算的结果来提高函数的性能。
基本思想是,我们构建一个空对象,然后添加键作为散列值或参数值,然后如果我们得到一个已经在对象键上可用的参数,那么我们返回该键的对象值
下面的函数有几个变体,但这个实现的性能比其他实现要好得多
用法:
var cachedIsPrime = memoize(isPrime);
var isPrime = cachedIsPrime(2);
isPrime = cachedIsPrime(3);
然后你可以传递需要记忆的函数
操作说明:
对于具有单个参数的上述上下文,可以使用如下简单的memoize函数:
var memoize = function(passedFunc) {
var cache = {};
return function(x) {
if (x in cache) return cache[x];
return cache[x] = passedFunc(x);
};
};
请注意,如果您关心性能,您还应该考虑使用seive来代替它,或者至少从循环头中调用
Math.sqrt()
。seive将有效地用于缓存。seive如何作为我的缓存的用途?因为seive是每个数字的映射(不超过已计算数量的限制)和指示数字是否为素数的标志。
var cachedIsPrime = memoize(isPrime);
var isPrime = cachedIsPrime(2);
isPrime = cachedIsPrime(3);
var memoize = function(passedFunc) {
var cache = {};
return function(x) {
if (x in cache) return cache[x];
return cache[x] = passedFunc(x);
};
};