【发布时间】:2013-01-25 14:02:13
【问题描述】:
上周我将递归 Branch&Cut 算法从 Matlab 移植到 C++,并希望看到求解时间显着减少,但尽管听起来令人难以置信,但事实恰恰相反。 现在我并不是真正的 C++ 专家,所以我下载了 sleepy profiler 并试图找到潜在的瓶颈。我想问一下我是否从中得出了正确的结论,或者我是否正在寻找一个完全错误的方向。
我让代码运行了 137 秒,这就是分析器显示的内容(下面还有许多其他条目,但它们无关紧要):
如果我做对了,98 秒用于创建新对象,34 秒用于释放内存(即删除对象)。
我会检查我的代码,看看哪里可以做得更好,但我也想问你是否有任何关于导致此类行为的常见错误或不良习惯的提示。我想到的一件事是我在代码中使用了很多临时的 std::vectors 来计算东西,所以这可能会很慢。
为了避免你失明,我不会在我仔细研究之前发布我的代码,但如果我不能自己解决这个问题,我会回来的。
【问题讨论】:
-
这不是一个真正的问题。没有看到代码就无法说出发生了什么。但一般来说,新手 C++ 程序员经常编写慢程序,因为他们不了解 C++ 的值语义和复制构造函数语义。您需要尽可能使用引用或移动语义以避免不必要的向量/字符串复制,以及
vector::reserve以减少重新分配的数量。 -
我对 C++ 还有些陌生,但我认为在堆栈上分配临时空间会有很大帮助。
-
您在分析调试版本吗?您应该对所有优化进行分析。
-
这是一个发布版本,Visual Studio 设置为“完全优化”,所以我担心这是我的代码的问题。但是感谢您的 cmets,我看到我在正确的轨道上!
-
如何在函数之间传递向量(尤其是大向量)?通过值:
void function(vector a),通过引用:void function(vector &a)或通过指针:void function(vector *a)分别。void function(shared_ptr<vector> a)?
标签: c++ performance profiler