【问题标题】:large array of numbers vs smaller array of objects大数组与小对象数组
【发布时间】:2016-09-28 21:17:55
【问题描述】:

在迭代所有元素时,什么会更快?

方法一:

let array = [10, 0, 0, 20, 1, 0, 12, 2, 0];

for(let i = 0, l = array.length; i < l; i += 3) {
    doSomething(array[i], array[i + 1], array[i + 2]);
}

方法二:

let array = [{id:10, x:0, y:0}, {id:20, x:1, y:0}, {id:12, x:2, y:0}];

for(let i = 0, l = array.length, current = null; i < l; ++i) {
    current = array[i];
    doSomething(current.id, current.x, current.y);
    // i'm aware that we could make doSomething work with the object
    // -> even a thing to consider?
}

我的猜测是我们使用 1 会更快,但是你们可能拥有更多的 v8、spidermonkey 等英特尔,所以最终对象处理和较小的数组可能会更快?

【问题讨论】:

  • 您为什么不使用Date.now() 自己看看?
  • 方法 1 应该更快,但方法 2 是组织您正在使用的数据的更好方法。
  • 我不认为以这种或那种方式访问​​对象属性在 2016 年会产生重大变化。我希望两者在性能方面做同样的事情。
  • 你为什么这么问?最好的猜测是差异可能非常小,您很可能过度优化
  • 您可以使用Performance.now()自行查看

标签: javascript arrays performance object


【解决方案1】:

两者都是O(n)。别的都无所谓。甚至它们的内存消耗也只会略有不同。当您认为这对性能至关重要时,您可以自己进行基准测试,但 it most likely isn't

使用对象是因为它们为您的数据提供了清晰的结构并使您的代码更具可读性。是的,您应该考虑将这样的对象传递给doSomething

【讨论】:

  • 感谢您谈论内存管理的英特尔一点点,我想我会选择第二种方式,@dadykhoff 的测试表明它在游戏代码中甚至不会是关键的。
【解决方案2】:

同时运行您的两个方法 https://www.measurethat.net/ 表明方法 1 的速度快了约 2,300 次操作/秒。

https://www.measurethat.net/Benchmarks/ShowResult/1363

【讨论】:

  • "2300 ops/s" 毫无意义。说 sn-p 2 的运行速度比 sn-p 1 慢 12% 左右是合理的,但实际上该基准测试与许多微基准测试一样存在缺陷。
  • 也依赖于浏览器和操作系统 .... 我在 2 个浏览器中尝试过,并且两者都相当接近
  • 嗯,感谢更换 JSPerf。它们在 FF v50 中的结果相同,在 Chrome v54 中几乎相同
  • 感谢您的测试,我正计划在渲染旁边循环使用它 - 简而言之 - 用于游戏,所以我认为这种微优化是必要的。
猜你喜欢
  • 2014-12-18
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 1970-01-01
相关资源
最近更新 更多