移動語義move性能測試

動機:減少非必要的拷貝

實現思路:

1、必須要語法讓我們在調用端告訴編譯器,這是個Rvalue  std::move可以實現

2、必須有語法讓我們在被調用端寫出一個專門處理Rvalue的函數,參考std::string的實現

std::move 將實參強制轉換成了右值

測試代碼:

void test_move() {
    for(int j = 13; j < 20; ++j) {
        const int64_t times = 10;
        std::string str = "tt";
        for (int i = 0; i <= j; ++i) {
            str += str;
        }
        cout << "test string size(kb):" << str.size()/1024 << endl;
        cout << "move or copy times:" << times << endl;
        std::vector<std::string> v_copy;
        std::vector<std::string> v_move;

        // 將使用 push_back(const T&), 即產生拷貝行爲
        auto begin = std::chrono::steady_clock::now();
        for (int i = 0; i < times; ++i)
            v_copy.push_back(str);
        auto time = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now() - begin).count();
        cout << "copy time(us):" << time << endl;
    
        auto begin2 = std::chrono::steady_clock::now();
        for (int i = 0; i < times; ++i)
            v_move.push_back(std::move(str));
        time = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now() - begin2).count();
        cout << "move time(us):" << time << endl;
    }
}

move和copy的時間比,時間單位us

數據大小(kb)

操作1次

操作5次

32k

1/24

4/171

64k

1/42

3/235

128k

1/70

4/474

256k

1/164

10/916

512k

1/297

4/1698

1024k

1/593

3/3165

2028k

1/1326

4/5630

發佈了89 篇原創文章 · 獲贊 212 · 訪問量 47萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章