我正在用 C++ 重写一些渲染 C 代码。旧的 C 代码基本上计算它需要的所有内容并在每一帧渲染它。新的 C++ 代码改为预先计算它需要的内容并将其存储为链表。
现在,实际的渲染操作是翻译、颜色更改和对 GL 列表的调用。
虽然执行链表中的操作应该非常简单,但结果方法调用似乎比旧版本花费的时间更长(每次都会计算所有内容 - 我当然确保新版本不会重新计算)。
奇怪的事?它执行的 OpenGL 操作比旧版本少。但它变得更奇怪了。当我为每种类型的操作添加计数器,并在方法结束时添加一个很好的旧 printf 时,它变得更快- gprof 和手动测量都证实了这一点。
我还费心看一下 G++ 在两种情况下(有和没有跟踪)生成的汇编代码,并且没有重大变化(这是我最初的怀疑) - 唯一的区别是为计数器分配了更多的堆栈字,增加所述计数器,并准备 printf 然后跳转到它。
同样,这对 -O2 和 -O3 都适用。我在 Ubuntu Maverick 上使用 gcc 4.4.5 和 gprof 2.20.51。
我想我的问题是:发生了什么?我究竟做错了什么?有什么东西让我的测量结果和 gprof 都丢了?