【问题标题】:Which one is faster: array[i] + n vs array[i+1] [closed]哪个更快:array[i] + n vs array[i+1] [关闭]
【发布时间】:2020-12-28 02:08:41
【问题描述】:

假设我有一个数字数组,每个数字都比前一个大 n。 给定数组的一个元素,哪种方法检索下一个元素更快?

array[i]+n

array[i+1]

我知道差异可能很小,但我很好奇理论上哪个更有效?

如果每个都是前一个的 n (*n) 倍,它会改变吗?

编程语言重要吗?如果是这样,那么javascript呢?

【问题讨论】:

  • 您能否提供更多上下文或有关此声明的示例? “每个比前一个大 n 的数字数组”。编程语言和数组是静态的还是动态的一样重要。编译语言可以在编译时而不是运行时执行计算。
  • 正如轶事细节:在许多当前的 CPU 中,有一些指令格式可以访问具有固定偏移量的数组中的字段以及基于某些寄存器的可变偏移量,并“免费”完成所有这些计算(即,由于用于此特定计算的专用电路,它们可以以与从固定地址访问内存完全相同的速度执行)。我不能告诉你任何给定系统上的任何给定 JavaScript 引擎是否会使用它,但这应该让你知道谁会误导一些关于性能的“明显”假设。

标签: javascript arrays performance memory


【解决方案1】:

基本上不可能在摘要中回答这个问题。

您认识到差异(如果有的话)将非常非常小。

在差异如此大的情况下,很多因素可以发挥作用,其影响比任何根本差异都要大。

主要示例:如果 array[i] 当前位于执行该代码的 CPU 的 L1 缓存中,但 array[i+1] 不在,那么第一个将方式更快,但如果它是否则,第二个会更快。

这甚至没有考虑编译器/运行时优化对事物的影响。

例如,如果编译器早先已经优化了边界检查,因为它知道array 至少有i 元素,那么第二个可能会强制进行边界检查,这会减慢速度,但推理抽象地讲这个基本上是不可能的。

话虽如此:内存速度的增长速度不如 CPU 速度快。这意味着每次重新执行简单的计算通常比放入某个查找表要快得多。事实上,拥有一个大查找表可以减慢不相关代码,因为它需要大量缓存行并从缓存中删除其他数据,然后必须从缓存中获取(相对较慢)又是 RAM 芯片。

tl;dr 两者在性能上几乎没有区别。任何实际的、可衡量的差异都将在很大程度上取决于它们所使用的上下文。衡量执行实际相关工作的代码的性能并采取行动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-24
    • 2023-04-10
    • 2011-07-27
    • 1970-01-01
    • 2017-10-16
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多