【问题标题】:JavaScript Array vs. Object with Large DataJavaScript 数组与大数据对象
【发布时间】: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


【解决方案1】:

在 JavaScript 中,数组是对象:

typeof [] === "object" //true

所以不,你没有错过任何语言方面的东西。

可能优化来自运行时,而不是数据结构使用不当的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 2015-11-13
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多