gpt4 book ai didi

c++ - 逐行改进 C++ 的读取文件?

转载 作者:可可西里 更新时间:2023-11-01 18:15:47 26 4
gpt4 key购买 nike

我正在解析一个约 500GB 的日志文件,我的 C++ 版本需要 3.5 分钟,我的 Go 版本需要 1.2 分钟。

我正在使用 C++ 的流将文件的每一行流式传输以进行解析。

#include <fstream>
#include <string>
#include <iostream>

int main( int argc , char** argv ) {
int linecount = 0 ;
std::string line ;
std::ifstream infile( argv[ 1 ] ) ;
if ( infile ) {
while ( getline( infile , line ) ) {
linecount++ ;
}
std::cout << linecount << ": " << line << '\n' ;
}
infile.close( ) ;
return 0 ;
}

首先,为什么使用这段代码这么慢?其次,如何改进它以使其更快?

最佳答案

C++ 标准库 iostreams 是出了名的慢,标准库的所有不同实现都是如此。为什么?因为该标准对实现提出了许多要求,从而抑制了最佳性能。标准库的这一部分大约是 20 年前设计的,在高性能基准测试中并没有真正的竞争力。

如何避免呢?将其他库用于高性能异步 I/O,例如 boost asio 或操作系统提供的 native 函数。

如果您想保持在标准范围内,函数std::basic_istream::read() 可能会满足您的性能需求。但是在这种情况下,您必须自己进行缓冲和行计数。这是如何完成的。

#include <algorithm>
#include <fstream>
#include <iostream>
#include <vector>

int main( int, char** argv ) {
int linecount = 1 ;
std::vector<char> buffer;
buffer.resize(1000000); // buffer of 1MB size
std::ifstream infile( argv[ 1 ] ) ;
while (infile)
{
infile.read( buffer.data(), buffer.size() );
linecount += std::count( buffer.begin(),
buffer.begin() + infile.gcount(), '\n' );
}
std::cout << "linecount: " << linecount << '\n' ;
return 0 ;
}

如果速度更快,请告诉我!

关于c++ - 逐行改进 C++ 的读取文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34493913/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com