我尝试了这些代码,来比较std::copy和std::string的构造函数。
我得到了结果:
#include <chrono>
#include <iostream>
#include <vector>
void construct_test() {
std::vector<uint8_t> raw_data;
for (int i = 0; i < 1000 * 1024; i++) {
raw_data.push_back(i % 256);
}
auto start = std::chrono::high_resolution_clock::now();
std::string target_data;
target_data = std::string(raw_data.begin(), raw_data.end());
auto finish = std::chrono::high_resolution_clock::now();
std::cout << "construct: " << std::chrono::duration_cast<std::chrono::microseconds>(finish -
start)
.count()
<< "us" << std::endl;
}
void copy_test() {
std::vector<uint8_t> raw_data;
for (int i = 0; i < 1000 * 1024; i++) {
raw_data.push_back(i % 256);
}
auto start = std::chrono::high_resolution_clock::now();
std::string target_data;
target_data.resize(raw_data.size());
std::copy(raw_data.begin(), raw_data.end(), target_data.begin());
auto finish = std::chrono::high_resolution_clock::now();
std::cout << "copy: " << std::chrono::duration_cast<std::chrono::microseconds>(finish -
start)
.count()
<< "us" << std::endl;
}
int main() {
construct_test();
copy_test();
return 0;
}
我得到了结果:
construct: 6245us
copy: 1087us
std::copy
的速度快了6倍!
这是否符合预期?如果是,原因是什么?
我搜索了很多将向量转换为字符串的方法,但没有人提到std::copy
的方式。我应该使用这种方式吗?有什么缺点吗?
high_resolution_clock
不应该用于基准测试。请使用steady_clock
。 - 463035818_is_not_an_aitarget_data
来产生任何可观察的效果。当开启优化时,预计这些调用将被优化掉。 - 463035818_is_not_an_aiconstruct_test()
和copy_test()
的顺序调换一下。现在复制的速度变慢了。https://ideone.com/aemRow - VLL