【发布时间】:2014-12-18 09:59:28
【问题描述】:
我正在尝试使用 Eratosthenes 筛法对给定限制下的素数求和。为了比较使用数组和对象来存储数据/执行此操作,我编写了两个函数。我发现对象函数的筛子部分比数组函数的筛子部分花费的时间更长。为什么是这样?对象的底层结构是否有一些我不理解的基本特征?
function sumOfPrimesUsingArray(limit) {
var primeArray = [],
i,
j,
sum;
//Crete array filled with values
for (i = 2; i < limit; i += 1) {
primeArray[i] = i;
}
//Perform the sieve
for (i = 2; i < limit; i += 1) {
if (primeArray[i] !== 0) {
for (j = primeArray[i] + primeArray[i]; j < limit; j += primeArray[i]) {
primeArray[j] = 0;
}
}
}
//Sum with a loop
sum = 0;
for (i = 2; i < limit; i += 1) {
sum += primeArray[i];
}
return sum;
}
还有对象版本的代码……
function sumOfPrimesUsingObject(limit) {
var primeObject = {},
i,
j,
sum,
primes;
//Create object filled with values
for (i = 2; i < limit; i += 1) {
primeObject[i] = i;
}
//Perform the sieve (takes forever)
for (i = 2; i < limit; i += 1) {
if (primeObject[i] !== undefined) {
for (j = primeObject[i] + primeObject[i]; j < limit; j += primeObject[i]) {
delete primeObject[j];
}
}
}
//Sum with a loop
sum = 0;
for (primes in primeObject) {
if (primeObject.hasOwnProperty(primes)) {
sum += primeObject[primes];
}
}
return sum;
}
【问题讨论】:
-
你本质上是在问为什么数组比连续数字索引的对象更有效?你对此感到惊讶吗?与更通用的对象相比,数组在专门设计的用途上不是更好吗?
-
数组针对整数索引进行了优化。
deleteing 属性非常昂贵。尝试使用primeObject[j] = undefined再次运行。 -
嗯,数组绝对是最好的选择。不过,您使用的操作是不同的。这是一个带有对象的优化示例,您会看到差异是 1.5-2 倍:jsfiddle.net/pfn1knmn
-
啊,谢谢@juvian 看到这个很有帮助!
-
使用筛子的唯一问题是内存,所以过一段时间你需要使用另一种方法
标签: javascript arrays performance object hashtable