使用istringstream的性能问题

时间:2015-02-04 10:09:51

标签: c++ file parsing csv stream

我正在解析一个大型CSV文件(~450 MB)。解析器基于ifstreamgetline。这非常有效,但需要一些时间。为了减少时间,我尝试将CS​​V文件的压缩版本(~21 MB)读入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同时阅读和解析文件更快?

1 个答案:

答案 0 :(得分:0)

正如您在性能结果中所述,解析时间是不变的,因此,两种方法读取文件的速度都比解析时快。因此,速度瓶颈就是解析本身,并且更快地读取文件对性能没有帮助。如果您想进一步优化代码,则需要对解析器执行某些操作。