2011-02-01 55 views
2

我正在编写一个游戏,在渲染代码中进行速度计算非常重要。运算速度

如何获得某些操作的速度?

例如,如何知道乘法是否比sqrt等更快?或者我必须进行测试并计算时间。

编程语言是C++,谢谢。

+0

找到处理器参考并查看延迟/吞吐量:例如http://download.intel.com/design/processor/manuals/248966.pdf – Anycorn 2011-02-01 19:03:19

回答

5

这种微型优化只是浪费你的时间以获得最小收益。

使用一个分析器,并开始通过改进自己的算法和代码,无论探查器告诉你游戏花费大部分时间。

请注意,在某些情况下,为了实现更高效的设计,您可能必须检修整个软件或其中的大部分软件。在这种情况下,剖析器的结果可能会误导缺乏经验的人。例如。与一劳永逸地缓存其结果相比,优化复杂计算可能获得最小的收益。请参阅this somewhat related thread

0

最好的办法是使用像AQTime这样的工具并进行性能分析。然后你会知道在哪里花时间优化。但是过早地做或者基于猜测工作可能不会让你感觉太多,并且使代码复杂化或者破坏某些东西。如果可以的话,最好的办法是进行任何浮点计算,特别是sin,cos等,以及sqrt。

我曾经有过这样的事情:

for i = 0 to nc 
    for j = 0 to nc 
     aij = sqrt(a[i]*b[j]) 

,其计算NC数控*平方根。但是由于sqrt(a * b)等于sqrt(a)* sqrt(b),所以您可以事先预先计算所有a和b的平方根,以便循环变成如下所示。所以不是nc * nc平方根,而是2 * nc平方根。

for i = 0 to nc 
    for j = 0 to nc 
     aij = asqrt[i]*bsqrt[j] 
0

您问的问题高度依赖于您在硬件级开发的平台。不仅在不同的芯片组之间会有差异(英特尔/ AMD),而且平台上也会有不同的变化(我怀疑iPhone没有尽可能多的指令去做某些事情)。

您在您的问题中声明您正在讨论“呈现代码”。如果您正在讨论实际在GPU(着色器代码)上运行的代码而不是CPU,则规则会发生大规模变化。

由于@thkala说,我真的不会在你开始之前担心这一点。我发现它不仅更容易,而且可以更快地以首先使用的方式进行编码,然后(只有在需要改进时)重新编写代码分析时缓慢的位。更好的算法通常会提供比尝试仅使用特定功能更好的性能。

在我们正在为iPhone开发的游戏中,我唯一想到的就是大数学运算(sqrt)很慢(不是基本的数学运算),而且运行的循环每一帧都会很快吃光CPU。牢记这一点,我们不需要优化任何代码 - 因为它无论如何都以60fps运行 - 所以我很高兴我一开始并不担心它。

1

确定特定操作的速度通常称为分析。对操作进行分析的最佳解决方案是使用分析器。 Visual Studio有一个很好的分析器。 Linux有gprof。如果你的编译器没有分析器,那么购买一个编译器可能是值得的,如果你经常分析你的代码的话。

如果不使用专业的探查度日,那么你通常可以通过嵌入自己到你的程序

check this out一些分析器的代码获得。