我有一个很大的 .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);
}
}
Run Code Online (Sandbox Code Playgroud)
我很好奇将字符串作为右值引用传递是否会更快,但它会慢大约 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));
}
}
Run Code Online (Sandbox Code Playgroud)
第一个代码示例的平均加载时间约为 58 毫秒,第二个代码示例的平均加载时间为 68-70 毫秒。我在想移动总是更快或等于复制,这就是为什么这对我来说似乎不正确。
有谁知道发生这种情况的原因?基准测试是使用以下方法完成的:
perf stats -r 100 ./a.out
Run Code Online (Sandbox Code Playgroud)
在 Arch Linux 上,代码已使用 GCC 10.2、C++17 std 编译。
此外,如果有人知道这样做的更佳方法,我们将不胜感激。
我正在测试以下代码,让我感到困惑的是析构函数调用比构造函数调用多:
#include <iostream>
struct A {
A() { std::cout << 1; }
A(int) { std::cout << 7; }
~A() { std::cout << 5; }
};
struct B {
B() { std::cout << 2; }
B(int) { std::cout << 9; }
~B() {std::cout << 3;}
};
struct C {
B b;
A a1;
A a2;
C() : a1(3){
b = 3;
a2 = 7;
}
};
int main(){
C c;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出如下:
B() A(int) A() B(int) ~B() A(int) ~A() …Run Code Online (Sandbox Code Playgroud)