本文是接续上一篇文章,没看过的可以去看上一篇文章
《STL源码分析》 rotate函数的random access iterator版 分析上篇
测试代码
//计算时间
auto get_duration(const chrono::system_clock::time_point &start, const chrono::system_clock::time_point &fin)
{
auto duration = chrono::duration_cast<chrono::microseconds>(fin - start);
return double(duration.count()) * chrono::microseconds::period::num / chrono::microseconds::period::den;
}
int main()
{
auto n = 10;
auto data_len = 20000000;
auto middle = 19;//旋转元素
auto avg_a = 0.0, avg_b = 0.0;
vector<int> data_a(data_len);
vector<int> data_b(data_len);
iota(begin(data_a), end(data_a), 0);
iota(begin(data_b), end(data_b), 0);
//对2000w元素大小的vector<int>进行10次元素交换,记录每次交换的时间
while (n--)
{
auto start = chrono::system_clock::now();
//random access iterator版本
rotate_a(data_b.begin(), data_b.begin() + middle, data_b.end());
auto finish = chrono::system_clock::now();
auto duration = get_duration(start, finish);
avg_a += duration;
cout << duration << " ";
start = chrono::system_clock::now();
//forward iterator版本
rotate_f(data_a.begin(), data_a.begin() + middle, data_a.end());
finish = chrono::system_clock::now();
duration = get_duration(start, finish);
avg_b += duration;
cout << duration << "\n";
}
avg_a /= 10;
avg_b /= 10;
cout << avg_a << " " << avg_b << " " << avg_a / avg_b << "\n";
return 0;
}
测试结果
R版本的耗时是F版本的1.26倍,两者相差不多,并未出现那篇博文所说的6倍的差距,有可能是我某些地方搞错了,他的分析大家也可以去看一下。