减少fgets()中的重新填充次数

时间:2014-05-28 22:02:46

标签: c++ c parsing io fgets

我的C ++程序读入由换行符分隔的文本文件流。出于性能原因,我使用C I / O函数来处理这些数据。我正在使用fgets()将此文本文件流的一行读入char *缓冲区;使用与此问题无关的其他函数处理缓冲区。读入行直到EOF。

fgets()的幕后 - 例如,查看OpenBSD的源代码实现 - 看起来这个函数会在FILE指针的内部缓冲区用完后重新填充它要解析换行符的字符(假设有更多字符需要查看并暂时忽略其他终止条件)。

问题:从使用gprof进行分析时,看起来花了很多时间来阅读和处理输入,而不是在程序的其他地方,这通常是有效的。为了提高性能,我想探索减少这个程序的总I / O开销,我正在使用非常大的(多GB)输入。

问题:也许最小化重新填充是将文件I / O降至最低的一种方法。是否存在(平台无关的)方法来调整FILE指针使用的内部缓冲区的大小,还是需要使用自己的缓冲区编写自定义fgets()类似的函数?在解析文本文件时是否还有其他策略可以减少总体I / O开销(搜索,读取等)?


注意:我道歉但是我没有说明我正在使用哪种流 - 我应该更清楚地说明我的应用程序从stdin(标准输入)读取以及常规文件。

1 个答案:

答案 0 :(得分:4)

setbuf(3)系列函数允许您指定FILE*的缓冲。

具体来说,setbuffersetvbuf允许您分配一个您分配的与文件关联的缓冲区。或者,您只需指定大小为malloc ed。

另请参阅Controlling Buffering上的GNU libc文档。