Возврат объекта класса по значению или передача по ссылке, что будет быстрее - PullRequest
0 голосов
/ 17 января 2019

Предположим, у меня есть 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 голосов
/ 17 января 2019
  1. Без использования каких-либо инструментов,
    1. как профилировщик (например, gprof ), чтобы увидеть, сколько времени и где потрачено,
    2. или любые другие инструменты, такие как " valgrind + cachegrind ", чтобы увидеть, сколько операций выполняется в любой из двух функций,
  2. А также игнорирование всех оптимизаций компилятора, т.е. компиляция с -O0,
  3. И если предположить, что еще есть в двух функциях (то, что вы представляете как /* all required things */), тривиально,

Тогда все, что можно сказать, просто взглянув на обе ваши функции, состоит в том, что обе ваши функции имеют сложность O(n), поскольку обе ваши функции проводят большую часть времени в двух циклах for. В зависимости от того, насколько велик размер матриц, особенно если они действительно большие, все остальное в коде в значительной степени незначительно, когда речь идет о скорости вниз.


Итак, к чему сводится ваш вопрос, по-моему,

  1. За сколько времени это займет,
    1. для вызова конструктора C
    2. плюс возврат этого C, по сравнению с
  2. Сколько времени это займет,
    1. для вызова функции resize для C,
    2. плюс вызов конструктора копирования 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();

Хотя еще раз, по моему честному мнению, если ваши матрицы большие, большую часть времени будет идти в цикле for.

p.s. Преждевременная оптимизация - корень всего зла.

...