【发布时间】:2021-03-11 17:37:24
【问题描述】:
我有一个大的 .txt 文件,需要加载并存储在向量中。该文件大小约为 5MB,有 500 000 行,每行大约 10-20 个字符,以 '\n' 分隔。我正在使用下面的示例代码对读取整个文件所需的时间进行一些基准测试:
#include<iostream>
#include<vector>
#include<fstream>
int main()
{
std::fstream input("words.txt");
std::vector<std::string> vector;
std::string line;
while(input >> line){
vector.push_back(line);
}
}
我很好奇将字符串作为右值引用传递是否会更快,但它会慢大约 10 毫秒。
#include<iostream>
#include<vector>
#include<fstream>
int main()
{
std::fstream input("words.txt");
std::vector<std::string> vector;
std::string line;
while(input >> line){
vector.push_back(std::move(line));
}
}
第一个代码示例的平均加载时间约为 58 毫秒,第二个示例的平均加载时间为 68-70 毫秒。我在想移动总是更快或等于复制,这就是为什么这对我来说似乎不正确。
有谁知道发生这种情况的原因吗? 基准测试是使用:
perf stats -r 100 ./a.out
在 Arch Linux 上,代码已使用 GCC 10.2, C++17 std 编译。
如果有人知道更优化的方法,我们将不胜感激。
【问题讨论】:
-
文件 IO 破坏了所有基准测试的合法性,因为它比 cpu 计算慢得多。
-
@Aplet123 考虑到该文件只有 5MB 大小,我很确定在这种情况下文件 IO 是 cpu 计算。这更可能与程序必须再次为新字符串重新分配内存有关,因为前一个块已移动到向量中。
-
当你移动
line时它会变空,所以下一次迭代需要分配空间。std::string有一个小的缓冲区作为优化(大多数实现,如果不是全部的话)并且副本只是复制字符,没有内存分配。这可能是不同的。
标签: c++ stdvector move-semantics