按值返回类对象或按引用传递,这会更快

时间:2019-01-17 07:20:45

标签: c++ operator-overloading pass-by-reference

假设,我有一个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

以上哪种方法更快,更有效。我们应该使用哪个?

1 个答案:

答案 0 :(得分:0)

  1. 不使用任何工具,
    1. 像探查器(例如 gprof )一样,了解在哪里花费了多少时间
    2. 也不使用“ valgrind + cachegrind ”之类的其他工具来查看这两个功能中的任何一个执行了多少操作,
  2. 并且也忽略了所有编译器优化,即使用-O0进行编译,
  3. 假设这两个函数(您用/* all required things */表示)中的其他内容都是微不足道的,

那么,仅通过查看两个函数,所有人都可以说两个函数的复杂度为O(n),因为两个函数的大部分时间都花在两个{{1} }循环。取决于矩阵的大小,特别是如果矩阵的大小很大时,在降低速度方面,代码中的其他所有内容都不重要。


所以,我认为您的问题归结为

  1. 花费多少时间,
    1. 调用for的构造函数
    2. 加上返回的C, 与
  2. 需要多少时间,
    1. C调用resize函数,
    2. 还要调用C的副本构造函数。

您可以使用here(在多个答案中显示)使用Cstd::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。 过早的优化是万恶之源。