对象属性的JavaScript性能在各种浏览器中访问



我想详细说明这个问题。问题是,如果对象的访问时间是恒定的,即独立于属性。答案是,这确实是不变的。

我已经对JSFIDDLE进行了快速测试,但是(至少对于Chrome)表明,具有10个具有10个属性的对象的访问时间和具有100K属性的对象之间存在很大的差异(〜3倍)。

所以我的第一个问题是。访问时间是否真的很恒定,并且由于内存管理或与初始化相关而不是访问的内容而不精确地给出了差异吗?

然后THG435创建了一个基准,在其中很容易看到各种浏览器中大对象的访问时间之间的差异,例如IE和Safari在大小物体和小物体之间没有差异(基本上都非常慢),而Firefox,更多的Opera和更多的Opera和Chrome在访问时间上显示出巨大的差异。但它也显示出浏览器速度之间的不可思议的差异(例如,即比Firefox或Chrome慢50-100倍)。

我的第二个问题是 - 可以信任这些结果吗?还是一些优化(在实际的JS代码中不会产生很大的差异)在显着降低结果时会大大降低结果?如何建立访问变量的基准,这是公平的?我做出了第二个基准,以避免通过访问变量,而且使用其值(以衡量成本也以数字操作为代价)来避免优化,从而降低了Chrome和Opera的疯狂速度,但仍然是即慢100倍。我有点知道,IE很慢。但是慢得多的速度对我来说听起来可疑。

更新:我添加了第三个基准测试,旨在更好地解决复杂性。

脚注:它不允许我在没有代码的情况下以jsfiddle的链接发布问题,因此这是测试代码。

function go(amount) {
  var object1 = {};
  for (var i = 0; i < amount; i++) {
    object1['id' + i] = i;
  }
  var start = new Date().getTime();
  var j = 0;
  for (var i = 0; i < 100000000; i++) {
    j += object1['id3'];
  }
  var end = new Date().getTime();
  console.log(j);
  document.getElementById('result').innerHTML = end - start;
}

基本上可以将JavaScript中的对象视为哈希地图(键/键列表/与值配对的键)。

存在几种不同的实现,并且在基础实施如何工作的标准中没有任何限制。允许您简单地搜索每个索引中的密钥。

想象一下,有人实际上使用数组来实现上面绘制的地图,插入可以很快完成 - 只需将对推到数组的末端即可。删除也将很快(假设您有手头的索引)。但是,找到正确的索引很可能是对数组中的项目数(对)的线性。查找索引是此模型中对象值查找的要求。

JS发动机可能会使用某种搜索树结构来优化查找时间 - 但价格是插入或删除会受到损失 - 或两者兼而有之。

理智的假设是,查找的执行频率要比插入更频繁。因此,实现了一个好的搜索树(最有可能基于AVL -http://en.wikipedia.org/wiki/avl_tree)。

不同的搜索树在插入速度,删除和查找方面具有不同的属性。另一个属性是保留了插入令。在上面概述的"愚蠢的数组实现"中,保留了插入顺序,而在许多搜索树中,情况并非如此。您不能在ECMA标准中陈述,您不能依靠密钥的顺序(当密钥被插入,删除甚至查找时,某些树实现甚至可能会重新排序!)。但是,一些浏览器表示保留了插入顺序。只是,不要相信将来或其他浏览器平台是这种情况。

换句话说:您不能假设任何O(1)运行时间查找,插入或删除。您很可能会看到O(log n)中的某些内容,但是在JS发动机之间可能会有所不同。

最新更新