Rub*_*ens 1 c++ performance parsing fstream
我正在逐行读取文件,并从中提取整数.一些值得注意的要点:
文件格式(只有整数,由一些分隔符分隔):
x1 x2 x3 x4 ...
y1 y2 y3 ...
z1 z2 z3 z4 z5 ...
...
Run Code Online (Sandbox Code Playgroud)只是为了添加上下文,我正在读取整数,并计算它们,使用std::unordered_map<unsigned int, unsinged int>
.
只需循环遍历行,并分配无用的字符串流,如下所示:
std::fstream infile(<inpath>, std::ios::in);
while (std::getline(infile, line)) {
std::stringstream ss(line);
}
Run Code Online (Sandbox Code Playgroud)
给了我~7.7s的700MB文件.
解析每一行:
unsigned int item;
std::fstream infile(<inpath>, std::ios::in);
while (std::getline(infile, line)) {
std::stringstream ss(line);
while (ss >> item);
}
Run Code Online (Sandbox Code Playgroud)
给我~17.8s的同一个文件.
如果我将运算符更改为std::getline
+ atoi
:
unsigned int item;
std::fstream infile(<inpath>, std::ios::in);
while (std::getline(infile, line)) {
std::stringstream ss(line);
while (std::getline(ss, token, ' ')) item = atoi(token.c_str());
}
Run Code Online (Sandbox Code Playgroud)
它给出~14.6s.
有没有比这些方法更快的东西?我不认为有必要加快文件读取速度,只需要解析文件本身 - 两者都不会造成伤害,但是(:
这个计划
#include <iostream>
int main ()
{
int num;
while (std::cin >> num) ;
}
Run Code Online (Sandbox Code Playgroud)
需要大约17秒才能读取文件.这段代码
#include <iostream>
int main()
{
int lc = 0;
int item = 0;
char buf[2048];
do
{
std::cin.read(buf, sizeof(buf));
int k = std::cin.gcount();
for (int i = 0; i < k; ++i)
{
switch (buf[i])
{
case '\r':
break;
case '\n':
item = 0; lc++;
break;
case ' ':
item = 0;
break;
case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
case '8': case '9':
item = 10*item + buf[i] - '0';
break;
default:
std::cerr << "Bad format\n";
}
}
} while (std::cin);
}
Run Code Online (Sandbox Code Playgroud)
同一文件需要1.25秒.做你想要的......