Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用istringstream的性能问题_C++_File_Parsing_Csv_Stream - Fatal编程技术网

C++ 使用istringstream的性能问题

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

我正在分析一个大的CSV文件(~450MB)。解析器基于
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文件也被“缓存”在内存中。