【问题标题】:Why for loop with cached length is slower than simple for loop?为什么具有缓存长度的 for 循环比简单的 for 循环慢?
【发布时间】:2018-03-16 18:26:34
【问题描述】:

我正在阅读“JavaScript Ninja 的秘密”一书。但我对我在这本书中找到的数字感到困惑。在我看来,简单的 for 循环失去了获取数组长度的时间,所以如果之前缓存了长度,速度将会提高。但下图显示了相反的结果。有人可以给我理由吗? 。谢谢。

【问题讨论】:

  • 我们说的是 7% 的差异和 5% 的准确率。我会说这两个结果实际上是相等的。
  • 显然,从任何范围(取决于)存储/检索变量会导致性能有所下降。这就像使用布尔构造函数声明一个false 变量。
  • 我根本不喜欢这些在 jsperf 上的简短代码性能测试。恕我直言,他们几乎什么都没说。大多数发布在 stackoverflow 上的信息都没有经过认真处理,无法真正获取任何真实信息。
  • 这是一个讽刺的回应,因为我想知道循环实际上在做什么。 1 项、100000 项等
  • a) 浏览器非常擅长优化惯用代码(即缓存 .length 访问自己时,他们看到它没有改变)b) 你的 i 变量是全局的,这会减慢速度很多

标签: javascript performance


【解决方案1】:

js 中的性能是一个引擎优化代码的问题。引擎如何优化代码取决于编写优化的开发人员。而那些开发人员希望普通代码运行得更快,这意味着你的代码越“正常”,它运行得越快。因此,也许以第一种方式迭代数组是如此普遍,以至于有人对其进行了大量优化。我们可以从该数据中获得的唯一真实结果是:两种方式都足够快,无需在意差异。

【讨论】:

  • 很好的答案 - 但我想这不仅仅是 js 特定的东西,而是任何语言,不是吗?
  • @messerbill 程序集 :)
  • @JonasW。即使在汇编中,由于微码和缓存管道的不同,不同的指令也需要不同的时间,并且更常见的指令比不常见的指令更快。
  • 即使在组装时,分支预测器实现也可能会在一个处理器上而不是另一个处理器上运行。或者你在最初的几秒内得到了错误的处理器亲和性。或者操作系统/驱动程序代码在您的测试过程中出现了一些问题。或者...
  • 至少@JonasW。的期望是正确的二进制代码:)
猜你喜欢
  • 1970-01-01
  • 2020-10-14
  • 2017-11-09
  • 1970-01-01
  • 2019-12-08
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 2021-10-01
相关资源
最近更新 更多