带有OpenGL的C++性能怪异
C++ performance weirdness w/ OpenGL
我正在用C++重写一些呈现C代码。旧的C代码基本上计算它所需要的一切,并在每一帧渲染它。取而代之的是,新的C++代码预先计算它需要什么,并将其存储为链表。
现在,实际的渲染操作是翻译、颜色更改和调用GL列表。
虽然执行链表中的操作应该非常简单,但结果方法调用的时间似乎比旧版本要长(旧版本每次都会计算所有内容——我当然已经确保新版本不会重新计算)。
奇怪的事?它执行的OpenGL操作比旧版本少。但事情变得更奇怪了。当我为每种类型的操作添加计数器,并在方法末尾添加一个好的旧printf时,它变得更快了-gprof和手动测量都证实了这一点。
我还不厌其烦地查看了G++在这两种情况下生成的汇编代码(有迹和无迹),没有重大变化(这是我最初的怀疑)-唯一的区别是为计数器分配了更多的堆栈字,增加了所述计数器,并准备好printf,然后跳到它。
同样,这对-O2和-O3都适用。我在Ubuntu Maverick上使用gcc 4.4.5和gprof 2.20.51。
我想我的问题是:发生了什么?我做错了什么?是不是有什么东西把我的测量和gprof都搞砸了?
通过在printf中花费时间,您可以避免在下一次OpenGL调用中出现停顿。
如果没有更多信息,很难知道这里发生了什么,但这里有一些提示:
- 您确定OpenGL调用是相同的吗?您可以使用一些工具来比较发出的呼叫。确保没有由于可能的不同顺序而导致的状态更改
- 您是否尝试在运行时使用探查器?如果您有许多对象,在列表上循环时追逐指针这一简单事实可能会导致缓存未命中
- 您是否发现了CPU或GPU方面的特定瓶颈
以下是我自己对可能出现问题的猜测。您发送到GPU的调用需要一些时间才能完成:之前的代码通过混合CPU操作和GPU调用,使CPU和GPU并行工作;相反,新代码首先使CPU在GPU空闲时计算许多事情,然后在CPU无事可做时向GPU提供所有要完成的工作。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 在容量内调整矢量大小时的性能影响
- 了解算法的性能差异(如果以不同的编程语言实现)
- 未达到的情况会影响开关外壳性能
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 哪种方法更好,性能明智
- C++ 特征库:引用的性能开销<>
- 与多个 for 循环与单个 for 循环 wrt 相关的性能从多映射获取数据
- 基于范围的 for 循环range_declaration中各种说明符之间的性能差异
- std::p mr::memory_resource 如何与 std::container 产生性能差异?
- 不同的类或结构初始化方法之间的性能差异是什么?