Има ли смисъл да се прилага make_move_iterator заедно с vector::insert ?(C++)

Имам вектор от вектори и искам да ги свържа един по един, за да образувам дълъг вектор. Това може да стане чрез вмъкване в края. Вдъхновен от този въпрос , мислех си, че използването на make_move_iterator ще замени copy с move и по този начин ще бъде по-ефективно. Но следният тест показва, че make_move_iterator ще доведе до по-голямо потребление на време.

#include <iostream>
#include <string>
#include <vector>
#include <chrono>
using namespace std;

int main()
{
    string a = "veryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylongstring";
    vector<string> b(10,a);
    vector<vector<string> > c(1000,b);
    vector<string> d,e;

    auto t1 = chrono::system_clock::now();
    for(auto& item : c)
    {
        d.insert(d.end(),item.begin(),item.end());
    }
    cout << c[0][0].length() << endl;

    auto t2 = chrono::system_clock::now();
    for(auto& item:c)
    {
        e.insert(e.end(), std::make_move_iterator(item.begin()),std::make_move_iterator(item.end()));
    }

    auto t3 = chrono::system_clock::now();    
    cout << chrono::duration_cast<chrono::nanoseconds>(t2-t1).count() << endl;
    cout << chrono::duration_cast<chrono::nanoseconds>(t3-t2).count() << endl;
    cout << c[0][0].length()  << endl;
    cout << "To check that c has been moved from." <<endl;
}

//Output:
//122
//1212000
//1630000
//0
//To check that c has been moved from.

Затова се чудя дали този подход наистина помага за подобряване на ефективността?


person Jing Li    schedule 03.03.2015    source източник
comment
Не може да се възпроизведе, в моята система движещата се версия е около два пъти по-бърза от копиращата версия.   -  person Kerrek SB    schedule 03.03.2015
comment
@KerrekSB Благодаря ви. Да, осъзнах, че онлайн компилаторът, който използвам, може да е остарял. Ще се придържам към ideone в бъдеще.   -  person Jing Li    schedule 03.03.2015


Отговори (1)


Тестът в описанието на въпроса беше проведен на cpp shell

По-късно пробвах с ideone и се оказа, че make_move_iterator очевидно е по-ефективен. Така че изглежда зависи от компилатора.

122
320576
98434
0
To check that c has been moved from.
person Jing Li    schedule 03.03.2015