【发布时间】:2018-03-27 19:52:31
【问题描述】:
我写了一个小测试比较移动和测试语义:
#include <vector>
#include <iostream>
#include <iterator>
#include <chrono>
#include <iomanip>
using namespace std;
int main()
{
int lenLeft = 3;
int lenMid = 3;
vector<int> lenVec{10,100,1000,static_cast<int>(1e4),static_cast<int>(1e5),static_cast<int>(1e6),static_cast<int>(1e7)};
int reps = 100;
vector<double>delta_t_move;
vector<double>delta_t_copy;
//move
cout<<"move"<<endl;
{
for(int len : lenVec)
{
auto startTime = std::chrono::high_resolution_clock::now();
for(int i = 0; i<reps;i++)
{
vector<int> leftVec(len,0);
vector<int> rightVec;
move(leftVec.begin()+lenLeft+lenMid,leftVec.end(),std::back_inserter(rightVec));
leftVec.erase(leftVec.begin()+lenLeft+lenMid,leftVec.end());
vector<int> midVec;
std::move(leftVec.begin()+lenLeft,leftVec.begin()+lenLeft+lenMid,std::back_inserter(midVec));
leftVec.erase(leftVec.begin()+lenLeft,leftVec.begin()+lenLeft+lenMid);
}
auto endTime = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = endTime - startTime;
delta_t_move.push_back(elapsed.count());
}
}
//copy
cout<<"copy"<<endl;
{
for(int len : lenVec)
{
auto startTime = std::chrono::high_resolution_clock::now();
for(int i = 0; i<reps;i++)
{
vector<int> leftVec(len,0);
vector<int> rightVec = vector<int>(leftVec.begin()+lenLeft+lenMid,leftVec.end());
leftVec.erase(leftVec.begin()+lenLeft+lenMid,leftVec.end());
vector<int> midVec = vector<int>(leftVec.begin()+lenLeft,leftVec.begin()+lenLeft+lenMid);
leftVec.erase(leftVec.begin()+lenLeft,leftVec.begin()+lenLeft+lenMid);
}
auto endTime = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = endTime - startTime;
delta_t_copy.push_back(elapsed.count());
}
}
for(int i = 0; i<lenVec.size();i++)
{
cout<<"lenVec = "<<setw(40)<<lenVec.at(i)<<"\t\t : delta_t_copy/delta_t_move = "<< delta_t_copy.at(i)/delta_t_move.at(i)<<endl;
}
return 0;
}
我得到的这个程序的输出是:
move
copy
lenVec = 10 : delta_t_copy/delta_t_move = 0.431172
lenVec = 100 : delta_t_copy/delta_t_move = 0.257102
lenVec = 1000 : delta_t_copy/delta_t_move = 0.166006
lenVec = 10000 : delta_t_copy/delta_t_move = 0.108573
lenVec = 100000 : delta_t_copy/delta_t_move = 0.113769
lenVec = 1000000 : delta_t_copy/delta_t_move = 0.134912
lenVec = 10000000 : delta_t_copy/delta_t_move = 0.133874
我将大小为 len 的初始向量拆分为 3 部分。长度为 3 的第一片,长度为 3 的中间片,其余尺寸为len-6。
我的结果表明,复制语义比移动语义快得多。
我正在使用 MSVC2015。
知道这怎么可能是真的吗?什么情况下移动语义更快?
【问题讨论】:
-
发布minimal reproducible example,而不是博客文章的链接。
-
哦,我喜欢横向滚动代码...
-
除此之外,您正在“移动”
int's。这没有任何意义。 -
不要使用
vector<int>尝试使用vector<vector<int>>之类的东西,但正如 Vittorio 所说,请注意积极优化。如果您实际上没有用所有数据计算任何东西,那么没有什么可以阻止编译器优化您的所有数据操作。