C++ 使用istringstream的性能问题
我正在分析一个大的CSV文件(~450MB)。解析器基于C++ 使用istringstream的性能问题,c++,file,parsing,csv,stream,C++,File,Parsing,Csv,Stream,我正在分析一个大的CSV文件(~450MB)。解析器基于ifstream和getline。这确实很有效,但需要一些时间。为了减少时间,我尝试将压缩版本的CSV文件(~21MB)读入istringstream,并使用相同的解析器。但是,当使用ifstream或istringstream时,解析器花费的时间是相同的。根据我的理解,当使用istringstream时,解析器应该更快,因为内容已经在内存中缓冲了 下面是一些伪代码: ifstream file(filename) istream* fil
ifstream
和getline
。这确实很有效,但需要一些时间。为了减少时间,我尝试将压缩版本的CSV文件(~21MB)读入istringstream
,并使用相同的解析器。但是,当使用ifstream或istringstream时,解析器花费的时间是相同的。根据我的理解,当使用istringstream时,解析器应该更快,因为内容已经在内存中缓冲了
下面是一些伪代码:
ifstream file(filename)
istream* filePointer = &file
if(gz file) {
read file into string
decompress string
create istringstream from decompressed string
set filePointer to istringstream
}
parse(filePointer)
---
void parse(istream* file) {
// ...
while(getline(*file, line)) {
// ...
}
}
业绩结果:
- 未压缩
- 解析器:15秒(ifstream)
- 压缩的
- 读取文件并解压缩:4秒
- 解析器:15秒(istringstream)
这是一种正常行为,
istringstream
不比使用ifstream
同时读取和解析文件快?正如您在性能结果中所述,解析时间是恒定的,因此,两种方法读取文件的速度都比解析文件快。因此,速度瓶颈是解析本身,读取文件的速度过快对性能没有帮助。如果您想进一步优化代码,您需要对解析器做些什么。在处理未压缩的输入之前,您如何知道/确保未在操作系统文件系统缓存中缓冲该输入?这很容易隐藏磁盘I/O开销。也有可能输入在后台与解析同时被有效地“预读”,以便及时准备更多的数据;不一定期望它们简单地相加。您的结果仅仅表明磁盘IO不是瓶颈,可能是CPU/解析器算法。如果您认为用内存资源替换文件系统可以提高性能,然后我建议你多读一些关于当今操作系统的书,因为这在20年前可能是真的。如今,操作系统在其认为合适的情况下平衡了物理fs和内存的使用,它们与程序对内存(程序alloc/dealloc)和fs(使用文件名、读/写等)的使用无关。使用mem而不是fs可能会导致。。。由于交换而导致的fs(由操作系统)。OTOH文件也被“缓存”在内存中。