代码之家  ›  专栏  ›  技术社区  ›  zebediah49

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

  •  1
  • zebediah49  · 技术社区  · 16 年前

    我读过很多关于数组索引和指针的效率的文章,以及它是如何真正重要的,除非你做了很多事情。但是,我做了很多。

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

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

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

    谢谢 ~ZeB

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

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

    3 回复  |  直到 16 年前
        1
  •  3
  •   Amardeep AC9MF    16 年前

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

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

        2
  •  1
  •   James Anderson    16 年前

    我认为你不会看到任何不同。最重要的是,每次数组访问都要删除一个整数乘法,而且,在所有可能的情况下,GCC都会识别出发生了什么,并将其优化为指针算术。

        3
  •  1
  •   Pedro Loureiro    16 年前

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

    例如:有什么可以跳过的步骤吗?您是否可以为下一次迭代存储任何值?这需要更多的记忆,但可以节省你很多时间!