【问题标题】:Array index efficiency (specifically, temporary vars)数组索引效率(特别是临时变量)
【发布时间】:2010-06-22 04:07:17
【问题描述】:

我已经阅读了大量有关数组索引与指针效率的内容,以及除非您经常做某事,否则这并不重要。但是,我经常这样做。

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

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

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

谢谢 ~~泽布

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

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

【问题讨论】:

  • 基准测试显示什么?我猜没有区别。
  • 无论您做什么,都不要在没有明确定义的方法来衡量更改的成功/失败的情况下开始优化。

标签: c arrays performance


【解决方案1】:

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

最好运行分析器来查看问题的实际所在。您可能会惊讶于您离猜测瓶颈有多远。

【讨论】:

  • 我同意性能分析,但在某些情况下(在低端微型计算机上嵌入 C)有两个性能优势。一种是设置一个指向数组第一个元素的指针,然后假设循环是一个简单的递增计数,则乘法变为加法(避免在非常低端的处理器上调用函数)。另一种是使用 -> 来访问成员,避免每次拥有相同结构时都访问数组。根据环境、编译器等,这可能很重要。
【解决方案2】:

我认为您不会看到任何不同。最多你在每次数组访问时丢弃一个整数乘法,并且,gcc 很可能会识别发生的事情并将其全部优化为指针算术。

【讨论】:

    【解决方案3】:

    如果您想改善算法的运行时间,您可能应该尝试改善算法本身,而不是您的实现(除非您有明显未优化的东西)。

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

    【讨论】:

      猜你喜欢
      • 2016-03-25
      • 2013-06-26
      • 1970-01-01
      • 2021-03-10
      • 2012-05-01
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多