C++优化问题

3
我有一些中大型的项目正在积极使用boost库,因此在调试应用程序时性能受到影响(Visual Studio 2008)。
我目前使用的解决方案是即使在Debug模式下打开函数内联,这样就足够提高性能了,但肯定有一些缺点。
如果我使用强制函数内联(/Ob2)开关,有人知道我会失去哪些调试功能吗?
也许有人有任何其他关于加速boost /其他模板库调试性能的想法?

2
你对程序进行过性能分析吗?如果它只是写得不够优化呢? - sharptooth
@sharptooth 我正在对我的应用程序的 Render 方法进行性能分析,发现带有许多断言语句的 boost 方法可以轻松将 150 fps 降至 15 fps =) - Yippie-Ki-Yay
4个回答

8
在我看来,你应该不要对调试版本进行性能测试。将调试版本用于单元测试,以便轻松地发现问题,但真正的测试(包括功能和性能)应该在发布版本上进行。毕竟,这才是你的客户所使用的版本,对吧?

3
调试版本通常包含大量耗费时间的偏执检查。 - sharptooth
2
在游戏编程中,常见的问题是你经常需要调试模式运行得足够快以帮助调试游戏。在这种情况下,你的答案并没有帮助。然而,如果它在调试模式下“足够快速地进行调试”,并且在发布模式下真正更好,那么你是正确的:优化只有在发布模式下才有意义。 - Klaim

3

我同意之前的回答,通常情况下你不需要关心调试版本的性能。测试是必要的,因为我们需要它们...

然而,作为一个实用主义者,我不使用valgrinded应用程序来运行我的测试,原因是我也不希望它们太慢了,否则系统就变得完全不实用了。

我认为启用内联没有什么问题,当然,调试器可能会有一些问题,无法准确找到生成代码的位置,但它并不会修改代码本身。

我还见过部分调试版本的构建。其想法是关闭那些真正使程序崩溃的调试功能(如迭代器检查),以便性能保持在可接受的水平。如果你找出哪些调试功能会拖慢速度,这可能会对你有所帮助。话虽如此,我从未遇到过使用boost时的性能问题,但我使用gcc编译它,并不知道在调试模式下是否保留了内联。


+1 对于部分调试构建非常有用。我之前创建了一个 fast_debug 目标,它删除了 assert 并关闭了边界/迭代器检查。但是它没有进行内联。 - KitsuneYMG

1

我建议在 Debug 模式下调试应用程序,并在 Release 模式下使用它(用于性能测试、一般使用等)。这样,您在调试过程中就不需要担心丢失任何东西。

无论如何,在 Debug 模式下启用函数内联可能会在遍历代码时使调试器混淆,当您遇到已内联的函数的函数调用时。但我从未进行过测试,所以不确定。


1

在调试和发布配置中都使用/Ob2。这样,在调试时,它的行为方式与发布模式相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接