假设,我有一个class
对象matrix
。为了add
两个大元素matrix
,我可以定义一个重载+
的运算符或定义一个像这样的函数Add
matrix operator + (const matrix &A, const matrix &B)
matrix C;
/* all required things */
for(int i .........){
C(i)=A(i)+B(i);
}
return C;
}
我打过电话,
matrix D = A+B;
现在,如果我定义了Add
函数,
void Add(const matrix &A, const matrix &B, matrix &C)
C.resize(); // according to dimensions of A, B
// for C.resize , copy constructor will be called.
/* all required things */
for(int i .........){
C(i)=A(i)+B(i);
}
}
我必须像这样调用该函数
matrix D;
Add(A,B,D); //D=A+B
以上哪种方法更快,更有效。我们应该使用哪个?
答案 0 :(得分:0)
-O0
进行编译,/* all required things */
表示)中的其他内容都是微不足道的,那么,仅通过查看两个函数,所有人都可以说两个函数的复杂度为O(n)
,因为两个函数的大部分时间都花在两个{{1} }循环。取决于矩阵的大小,特别是如果矩阵的大小很大时,在降低速度方面,代码中的其他所有内容都不重要。
所以,我认为您的问题归结为
for
的构造函数C
,
与C
调用resize
函数,C
的副本构造函数。您可以使用here(在多个答案中显示)使用C
或std::clock()
来“粗略但相对较快”地进行测量。
chrono
尽管再说一次,以我的诚实观点,如果您的矩阵很大,则大多数时间将进入#include <chrono>
auto t_start = std::chrono::high_resolution_clock::now();
matrix D = A+B; // To compare replace on 2nd run with this ---> matrix D; Add(A,B,D);
auto t_end = std::chrono::high_resolution_clock::now();
double elaspedTimeMs = std::chrono::duration<double, std::milli>(t_end-t_start).count();
循环。
p.s。 过早的优化是万恶之源。