运营速度

时间:2011-02-01 19:00:22

标签: c++ performance operation

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

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

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

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

4 个答案:

答案 0 :(得分:5)

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

使用分析器,首先改进您自己的算法和代码,只要分析器告诉您游戏花费了大部分时间。

请注意,在某些情况下,您可能需要彻底检修整个软件 - 或其中的主要部分 - 以实现更高效的设计。在这种情况下,分析器结果可能会误导缺乏经验的人。例如。与一次性缓存其结果相比,优化复杂计算可以获得最小的增益。

另见this somewhat related thread

答案 1 :(得分:1)

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

如果您不使用专业的探查器,那么通常可以将自己的探测器嵌入到您的程序中

check this out代表某些个人资料的代码。

答案 2 :(得分:0)

您最好的选择是使用像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]

答案 3 :(得分:0)

您提出的问题在很大程度上取决于您在硬件级别开发的平台。不仅芯片组(Intel / AMD)之间存在差异,平台上也会有变化(我怀疑iPhone没有那么多指令可以更快地完成某些事情)。

您在问题中说明您正在谈论'渲染代码'。如果您正在讨论实际在GPU上运行的代码(着色器代码)而不是CPU,则规则会发生巨大变化。

正如@thkala所说,在你开始之前我真的不会担心这个问题。我发现它不仅更容易,而且更快速地以首先工作的方式编码,然后(只有当它需要改进时)重写在分析代码时缓慢的位。与仅尝试使用特定功能相比,更好的算法通常会提供更好的性能。

在我们为iPhone开发的游戏中,我唯一记住的是大数学运算(sqrt)很慢(不是基本数学)和每个运行的循环框架可以快速占用CPU。记住这一点,我们不需要优化任何代码 - 因为它总是以60fps运行 - 所以我很高兴我一开始并不担心它。