【问题标题】:Is there speed differences between iterating an array of bools, ints or longs?迭代 bool、int 或 long 数组之间是否存在速度差异?
【发布时间】:2017-02-06 07:13:33
【问题描述】:

我主要对 C# 感兴趣,但也欢迎一般性的回答。

与 int 相比,迭代 long 数组是否需要更长的时间?我想较大的值类型会占用更多内存,因此连续数组显然更长。但是如果间隔是 8、16 或 32 字节等,从 Array[0] 到 Array[1] 的跃点有什么不同吗?

如果是,大型结构类型(因为它的值)是否需要更长的时间?

还是遍历数组只是指向内存指针的内存指针,而下一项的间隙/位置并不真正相关?

【问题讨论】:

  • 为什么要遍历数组而不对元素做任何事情?如果你正在对元素做一些事情,为什么你认为这不会产生更大的影响?更重要的是,你为什么不直接race the horses yourself
  • 如果你不读元素那没关系(但那为什么要读呢?),如果你正在读它们,显然读更多的内存需要更多的时间。

标签: c# arrays performance optimization


【解决方案1】:

一个数组基本上有以下结构:

  • 一个初始内存指针
  • 长度值
  • 来自初始内存pointer + sizeof(type) * length的保留内存

有了这三个信息,指向任何值的确切位置是微不足道的:

memory pointer + sizeof(type) * element 其中0 <= element < length

当访问数组中的不同值时,编译器将转换它以执行这样的计算并在给定位置加载值(此处:在原语中)。两者之间没有差距,因为它的定义使O(1) 成为可能(并且是必要的)。

【讨论】:

  • 在真实的计算机中,内存访问不是 O(1) 而是 N 的增长函数,因为内存层次结构。这不是边际效应。
猜你喜欢
  • 2011-02-06
  • 1970-01-01
  • 2010-10-14
  • 2011-11-13
  • 2013-09-10
  • 2015-04-19
  • 2016-06-05
  • 1970-01-01
  • 2010-09-13
相关资源
最近更新 更多