关于性能:C代码执行慢

C++ code executes slow

我上周移植了一个递归分支


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

这就是为什么您应该事先声明尺寸。如果你知道你必须持有 n 元素,请将其声明为

1
 std::vector<MyClass> x(n);

1
2
 std::vector<MyClass> x;
 x.reserve(n);

而不仅仅是

1
 std::vector<MyClass> x;

后跟 n push_backs.

如果在这之后它仍然很慢,您可以为 std::vector 提供自定义分配器。我希望你不要达到那个地步。


在 Matlab 中,一切都是对对象的引用。因此,当您传递它们时,您相当于复制了一个指针(大小约为 int,具体取决于几个因素),而不是复制整个矩阵,这可能更大。

没有看到任何代码,我不能肯定地说,但我怀疑您正在复制大量对象而不是复制对它们的引用。我建议您查看智能指针,例如 std::shared_ptr.

你没有说清楚,但你应该优化编译。 (g++ -O3。) 一些昂贵的副本和其他操作可以优化出来,但不是全部。

此外,如果您是 C 新手,您不应该使用 new。它是为专家准备的,只有在与同事讨论并喝了一杯浓咖啡后才能使用。 (当然,new 可能会被某些容器代表您使用,例如 std::vector。)


n


避免调用 new