C++ 运行速度
我正在编写一个游戏,在渲染代码中进行速度计算非常重要 如何获得某些操作的速度 例如,如何知道乘法是否比sqrt快,等等?或者我必须做测试并计算时间C++ 运行速度,c++,performance,operation,C++,Performance,Operation,我正在编写一个游戏,在渲染代码中进行速度计算非常重要 如何获得某些操作的速度 例如,如何知道乘法是否比sqrt快,等等?或者我必须做测试并计算时间 编程语言是C++,谢谢。 < P>这种微优化只是浪费时间以获得最小的收益。 使用探查器,从改进您自己的算法和代码开始,只要探查器告诉您游戏花费了大部分时间 请注意,在某些情况下,为了实现更高效的设计,您可能必须对整个软件或其主要部分进行彻底检修。在这种情况下,探查器的结果可能会误导缺乏经验的人。例如,与一次性缓存其结果相比,优化复杂计算可能获得最小的
编程语言是C++,谢谢。
< P>这种微优化只是浪费时间以获得最小的收益。 使用探查器,从改进您自己的算法和代码开始,只要探查器告诉您游戏花费了大部分时间 请注意,在某些情况下,为了实现更高效的设计,您可能必须对整个软件或其主要部分进行彻底检修。在这种情况下,探查器的结果可能会误导缺乏经验的人。例如,与一次性缓存其结果相比,优化复杂计算可能获得最小的收益另请参见。您的最佳选择是使用AQTime之类的工具并执行分析运行。然后,您将知道在哪里花时间进行优化。但是过早地或基于猜测工作进行操作可能不会给您带来太多好处,只会使代码复杂化或破坏某些东西。最好的方法是将任何浮点计算,特别是sin、cos等,以及sqrt从任何循环中取出(如果可以的话) 我曾经有过这样的经历:
for i = 0 to nc
for j = 0 to nc
aij = sqrt(a[i]*b[j])
它计算nc*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]
您提出的问题在很大程度上取决于您在硬件级别开发的平台。不仅不同芯片组(Intel/AMD)之间会有差异,平台上也会有差异(我怀疑iPhone没有足够多的指令来更快地完成某些事情) 您在问题中声明您正在谈论“渲染代码”。如果您谈论的是实际在GPU(着色器代码)而不是CPU上运行的代码,那么规则会发生巨大变化 正如@thkala所说,在你开始之前,我真的不会担心这个问题。我发现,首先以一种有效的方式编写代码,然后(只有在需要改进的情况下)重写评测代码时缓慢的部分,不仅更容易,而且更快。与仅使用特定函数相比,更好的算法通常会提供更好的性能
在我们为iPhone开发的游戏中,我唯一记住的是大数学运算(sqrt)速度慢(不是基础数学),而运行每帧的循环会很快消耗CPU。记住这一点,我们几乎不需要优化任何代码——因为它都是以60fps的速度运行的——所以我很高兴一开始就不用担心它。确定特定操作的速度通常被称为评测。评测操作的最佳解决方案是使用评测器。VisualStudio有一个很好的分析器。Linux已经做到了。如果您的编译器没有分析器,那么如果您经常对代码进行评测,那么购买具有分析器的编译器可能是值得的 如果您必须在不使用专业分析器的情况下生存,那么您通常可以通过将自己的分析器嵌入到您的程序中来生存
查找一些分析器的代码。找到处理器参考,并在那里查找延迟/吞吐量:例如,与微指令优化相比,还有十亿其他东西可以给您带来更好、更大的提升。编译器已经在一定程度上做到了这一点(它将比您以前做得更好)。分析代码,找出瓶颈。然后改进瓶颈中的算法(编译器不太擅长算法)。对我来说,这听起来很像过早优化。您最好尝试在更高的抽象级别上找到优化。当您必须在这个级别上提出此类问题时,您不应该编写性能关键的代码,也绝对不应该考虑微优化(不要与不使用死板算法或完全不合适的数据结构混淆,这总是一件好事)。