C++代码执行缓慢

Chr*_*oph 3 c++ performance profiler

我花了最后一周将一个递归的Branch&Cut算法从Matlab移植到C++,并希望看到解决方案时间显着减少,但是听起来令人难以置信,情况正好相反.现在我不是C++的专家,所以我下载了昏昏欲睡的探查器并试图找到潜在的瓶颈.我想问一下,我是否从中得出了正确的结论,或者我是否正在寻找一个完全错误的方向.

我让代码运行137秒,这就是分析器显示的内容(下面的许多其他条目,但它们并不重要):

在此输入图像描述

因此,如果我做对了,花了98秒来创建新对象,花了34秒来释放内存(即删除对象).

我将通过我的代码,看看我能做得更好的地方,但我也想问一下你是否对产生这种行为的频繁错误或坏习惯有任何暗示.我想到的一件事是我在代码中使用了很多临时的std :: vector来计算东西,所以这可能很慢.

为了防止你失明,我不会在看了一会之前发布我的代码,但如果我不能自己解决这个问题,我会回来的.

Luc*_*ore 5

是的,std::vector如果误用,s可能会很昂贵.最大的性能损失可以是重新分配 - 因为大小需要动态调整,并且您具有元素必须在连续内存中的约束,每当您添加超出已分配的元素时,重新分配就会发生.

这就是为什么你要事先申报大小.如果你知道你必须持有n元素,请将其声明为

 std::vector<MyClass> x(n);
Run Code Online (Sandbox Code Playgroud)

要么

 std::vector<MyClass> x;
 x.reserve(n);
Run Code Online (Sandbox Code Playgroud)

而不仅仅是

 std::vector<MyClass> x;
Run Code Online (Sandbox Code Playgroud)

然后是npush_backs.

如果在此之后仍然很慢,您可以提供std::vector自定义分配器.我希望你没有达到这一点.