c - 数组索引效率(特别是临时变量)

标签 c arrays performance

我读过很多关于数组索引与指针的效率的资料,除非你做很多事情,否则这并不重要。但是,我经常这样做。

有问题的代码有一个结构数组。 (两个不同的,实际上是两种不同的类型,但无论如何)。由于我的背景主要是高级语言,所以我默认使用标准的 particles[i].whatever 格式。但是,我不确定这是否是个好主意。对于单次访问,​​我知道这并不重要,但就目前而言,我的两个主要函数之一调用了 particles[i].something 8 次,并且 boxes[boxnum ].something 每个粒子每次迭代 4 次。

目前,执行 5000 个粒子和 5000 次迭代大约需要一秒钟。这意味着我处理这些访问的频率高达每秒 2 亿次 [包括其他函数]。在那个频率下,每一点点滴都很重要(特别是因为我最终会在其他人的集群上按时运行这段代码)。

所以我的问题是,是否值得按照使用指向结构的指针而不是数组访问的方式做一些事情,gcc 是否会神奇地为我做这件事,或者它是否真的无关紧要。

谢谢 ~~泽布

编辑:好的,所以编译器魔法意味着我不应该担心它。谢谢。

你建议使用分析器,但我似乎无法让 gprof 告诉我任何比时间函数所花费的更细粒度的信息......我已经知道了。有什么可以逐行告诉我的吗?

最佳答案

如果您按顺序迭代数组,那么您可能受益于使用在每个循环中递增的指针。与取消引用数组相比,算术运算要少一些。但是,编译器非常擅长优化事物,因此您可能看不到任何好处。

最好运行一个分析器,看看问题到底出在哪里。您可能会惊讶于您离猜测瓶颈还有多远。

关于c - 数组索引效率(特别是临时变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3090204/

相关文章:

c - 我需要输入 20 个数字并仅输出双位置

c - 在 C 中向字符串添加子字符串时重新分配内存的最佳方法

mysql - native MySQL 分区和基于后端的分区之间的性能差异?

javascript - 分析 JavaScript 性能

PHP 扩展 : why int var changes to 0?

arrays - 在 C 中读取命令行参数并检查它是一个数字

c - 求数组中两个数的平方和

c - 为什么我不能在 C 中传递的函数内打印数组的大小?

java - 将 CSV 文件导入二维字符串数组

mysql - MySQL 中的枚举或 char(1)