我的c++代码缺乏性能
Performance Lack in my C++ Code
目前我正试图优化我的c++代码,以获得更好的性能,因为我有一个强大的java/c#背景。我已经测试了简单的例子,比如类之间的getter/setter,并实现了将它们与引用一起使用:
vector<string>& MyClass::getNum()
{
return num;
}
void MyClass::setNum(vector<string> &num)
{
this->num = num;
}
(假设向量中有15个以上的字符串)
比没有
快2倍。(使用简单/小参数时没有差异,但使用矢量等时差异很大)
我也在Java中尝试了同样的例子,但不知何故,我的Java代码仍然比c++快。有人能帮我吗?
在java中,一切都是指针,所以当你在java中这样做时:
void function (ArrayList <Integer> myList);
在c++中几乎相当于:
void function (std::vector <int> & myList);
void function (std::vector <int> * myList);
这回答了你关于为什么Java在c++中不使用引用时更快的问题,因为引用在大多数情况下更快。那么,为什么它能提高性能呢?
好吧,假设你有一个int型的向量,如果你把它传递给一个没有引用的函数,你必须复制这个对象(调用复制构造函数),这通常会花费大量的时间,因为你必须分配一个新的数组,等等。另一个结构体的例子:
struct X {
int a[100] ;
int b[100] ;
} ;
这个结构体在现代机器上占用2 * 100 * 4 = 800
字节(当然可能有所不同),所以如果你把它传递给这样的函数:
void function (X x) ;
当你调用这个函数时,你需要做一个拷贝,所以800 bytes
的拷贝,如果你这样做:
void function (X const& x) ;
您只传递对对象的引用,即指向对象的内容,它将占用(在x64架构上)8个字节。
this->num = num;
:这一行复制了您通过引用传递的向量。如果您的目标是将向量提供给MyClass
,然后忘记它,请考虑通过右值引用传递它并移动它。
相关文章:
- GCC 和 Clang 代码性能的巨大差异
- 如何使用本征提高性能?(包括示例代码)
- 在.cpp文件中定义方法而不是在 C++ 的 .h 文件中定义方法时,如何提高代码的性能?
- 使用 const double* const 作为模板参数 - 代码性能问题
- 如何在没有性能命中的情况下抽象SIMD代码来处理不同的数据类型
- 为什么 C++ 代码实现的性能不比 python 实现更好?
- 如何提高此 OpenCL 缩减内核代码的性能?
- 相同的代码在不同的 gcc 编译器中存在巨大的性能差异
- 如何基准C 代码的性能
- 相同的代码执行两次:性能差异
- 附加到 C++/CLI dll 的性能探查器无法访问本机C++代码
- 牢记干净的代码的性能,什么更好
- 在将其尺寸较大的向量移动到容量较小的向量之前,是否可以通过使用Reserve()来提高代码性能
- 如何提高四叉树代码的性能以防止程序冻结
- C++多线程性能比单线程代码慢
- 在C++代码中使用纯 C 库是否有性能下降/损失
- 如何使用QueryPerformanceCounter测试现有代码的性能
- 公开类的内部组件,以防止编写过多代码和影响性能
- 从编译器优化和代码性能的角度来看,"if constexpr"与"if"
- C++按字符串调用函数,比较PHP的性能,如何在C++中优化代码