【问题标题】:Which javascript structure has a faster access time for this particular case?对于这种特殊情况,哪种 javascript 结构的访问时间更快?
【发布时间】:2012-09-26 20:27:15
【问题描述】:

我需要将特定数字映射到字符串值。这些数字不一定是连续的,所以例如我可能有这样的东西:

var obj = {};
obj[10] = "string1";
obj[126] = "string2";
obj[500] = "string3";

如果我要像 obj[126] 这样进行搜索,使用对象 {} 或数组 [] 会更快吗?

【问题讨论】:

  • 快速谷歌搜索返回几个 StackOverflow 问题,这些问题得到了回答,并且应该清楚每个浏览器 JS 引擎的实现方式不同,因此每个可能有不同的结果:google.com/…
  • 数组也只是对象——我认为没有太大的区别或优化(尤其是你的稀疏“数组”)。测试一下。

标签: javascript arrays performance object data-structures


【解决方案1】:

不会有什么不同。 ECMAScript 数组,如果稀疏(即没有设置连续索引)被实现为哈希表。在任何情况下,您都可以保证 O(n) 访问时间,因此您完全不必担心。

【讨论】:

【解决方案2】:

我为您创建了一个 microbenchmark - 查看@Bergi 的more comprehensive test。在我的浏览器上,对象文字有点慢,但并不显着。自己试试吧。

【讨论】:

  • 您正在测试分配,这确实需要更多的数组开销,但问题是关于搜索。 “如果我正在做这样的搜索 obj[126]...”
  • 有趣的是,在 Chrome 中我得到对象字面量的速度更快,但是是的,我更关心搜索而不是赋值。
  • 查看jsperf.com/sparse-objects,它使用了更多随机值。
  • @Bergi:+1,我允许自己在回答中包含您的链接,希望您不介意 (?)
【解决方案3】:

JS-array 是一个对象,所以你选择什么并不重要。

创建了一个 jsperf 测试 (http://jsperf.com/array-is-object) 来证明这一点。

【讨论】:

    【解决方案4】:

    当然,一个对象应该是最好的选择。

    如果你有这样的代码:

    var arr = [];
    arr[10] = 'my value';
    

    ,你的数组变成了一个包含 11 个值的数组

    alert(arr.length); // will show you 11
    

    ,其中前 10 个是 undefined

    显然你不需要一个长度为 1000 的数组来存储

    var arr = [];
    arr[999] = 'the string';
    

    我还必须注意,在编程中,您必须为特定情况选择合适的类。
    您的任务是制作key: value 对的映射,而这里的对象是更好的选择。
    如果您的任务是创建一个有序集合,那么请确保您需要一个数组。

    更新:

    在 cmets 中回答您的问题。

    假设您有两个“集合”——一个数组和一个对象。它们中的每一个只有一个等于 999 的键/索引。

    如果你需要找到一个值,你需要遍历你的集合。

    对于数组,您将进行 999 次迭代。
    对于对象 - 只有一次迭代。

    http://jsfiddle.net/f0t0n/PPnKL/

    var arrayCollection = [],
        objectCollection = {};
    
    arrayCollection[999] = 1;
    objectCollection[999] = 1;
    var i = 0,
        l = arrayCollection.length;
    
    for(; i < l; i++) {
        if(arrayCollection[i] == 1) {
            alert('Count of iterations for array: ' + i); // displays 999
        }
    }
    
    i  = 0;
    
    for(var prop in objectCollection) {
        i++;
        if(objectCollection[prop] == 1) {
            alert('Count of iterations for object: ' + i); // displays 1
        }
    }
    

    Benchmark

    总计:

    您必须正确设计应用程序并考虑未来可能需要对您的收藏进行一些不同操作的任务。
    如果您需要订购您的收藏品,您必须选择array
    否则object 可能是更好的选择,因为访问其属性的速度与访问数组项的速度大致相同,但在object 中的值搜索将比在稀疏array 中更快。

    【讨论】:

    • 为什么会有不同? ...关于您的更新,JavaScript 数组可能是稀疏的。执行 arr[10] = "val" 会为您提供一个包含 1 个成员的数组。从本质上讲,它实际上只是一个对象。
    • length 具有误导性。它与内存中数组的实际大小不对应。见这里:coredogs.com/article/…
    • 仅当您不需要遍历数组来查找值时。查看我的更新。
    • 我相信for...in 是一个更昂贵的操作,因此可能存在一个阈值,即迭代空项目仍然更快。
    猜你喜欢
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    相关资源
    最近更新 更多