Я думал, что emplace_back
будет победителем, когда сделаю что-то вроде этого:
v.push_back(myClass(arg1, arg2));
потому что emplace_back
построит объект сразу в векторе, а push_back
сначала создаст анонимный объект, а затем скопирует его в вектор. Для получения дополнительной информации см. этот вопрос.
Google также предоставляет this и this questions.
Я решил сравнить их для вектора, который был бы заполнен целыми числами.
Вот код эксперимента:
#include <iostream>
#include <vector>
#include <ctime>
#include <ratio>
#include <chrono>
using namespace std;
using namespace std::chrono;
int main() {
vector<int> v1;
const size_t N = 100000000;
high_resolution_clock::time_point t1 = high_resolution_clock::now();
for(size_t i = 0; i < N; ++i)
v1.push_back(i);
high_resolution_clock::time_point t2 = high_resolution_clock::now();
duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
std::cout << "push_back took me " << time_span.count() << " seconds.";
std::cout << std::endl;
vector<int> v2;
t1 = high_resolution_clock::now();
for(size_t i = 0; i < N; ++i)
v2.emplace_back(i);
t2 = high_resolution_clock::now();
time_span = duration_cast<duration<double>>(t2 - t1);
std::cout << "emplace_back took me " << time_span.count() << " seconds.";
std::cout << std::endl;
return 0;
}
В результате emplace_back
работает быстрее.
push_back took me 2.76127 seconds.
emplace_back took me 1.99151 seconds.
Почему? Ответ на первый связанный вопрос четко говорит о том, что разницы в производительности не будет.
Также пробовали с другими методами времени, но получили идентичные результаты.
[РЕДАКТИРОВАТЬ] В комментариях говорится, что тестирование с int
s ничего не говорит и что push_back
требует реф.
Я проделал тот же тест в приведенном выше коде, но вместо int
у меня был класс A
:
class A {
public:
A(int a) : a(a) {}
private:
int a;
};
Результат:
push_back took me 6.92313 seconds.
emplace_back took me 6.1815 seconds.
[РЕДАКТИРОВАТЬ.2]
Как сказал Денлан, я также должен изменить положение операций, поэтому я поменял их местами, и в обеих ситуациях (int
и class A
) emplace_back
снова был победителем.
[РЕШЕНИЕ]
Я запускал код в debug mode
, что делает измерения недействительными. Для сравнительного анализа всегда запускайте код в release mode
.
emplace_back
был бы быстрее - уж точно не медленнее. Чего я не понимаю (и нигде не могу найти), так это того, почему даже в этом простейшем случае у вас есть, почему оптимизатор не производит тот же код. Любые идеи? - person Ben   schedule 22.11.2019