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

时间:2010-06-22 04:07:17

标签: c arrays performance

我已经阅读了大量有关数组索引与指针效率的内容,以及除非你做了很多事情,否则它并不重要。但是,我这么做了。

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

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

所以我的问题是,如果使用指向结构而不是数组访问的指针来做某事是值得的,如果gcc会神奇地为我做这件事,或者它真的无关紧要。

由于 ~~瑞伯

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

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

3 个答案:

答案 0 :(得分:3)

如果您按顺序迭代数组,那么可能可以使用在每个循环上递增的指针。算术比解除引用数组少一点。然而,编译器非常擅长优化,因此您可能看不到任何收益。

最好运行一个分析器来查看问题的实际位置。您可能会对猜测瓶颈有多远感到惊讶。

答案 1 :(得分:1)

我不认为你会看到任何不同。你最多只是为每个数组访问丢弃一个整数乘法,并且,在所有概率中,gcc将识别发生的事情,并将其全部优化为指针算术。

答案 2 :(得分:1)

如果你想改善算法的运行时间,你应该尝试改进算法本身,而不是你的实现(除非你有一些显然没有优化的东西)。

例如:您可以跳过任何步骤吗?您可以为下一次迭代存储任何值吗?这会占用更多内存,但可以为您节省大量时间!