我的C ++程序读入由换行符分隔的文本文件流。出于性能原因,我使用C I / O函数来处理这些数据。我正在使用fgets()
将此文本文件流的一行读入char *
缓冲区;使用与此问题无关的其他函数处理缓冲区。读入行直到EOF。
在fgets()
的幕后 - 例如,查看OpenBSD的源代码实现 - 看起来这个函数会在FILE
指针的内部缓冲区用完后重新填充它要解析换行符的字符(假设有更多字符需要查看并暂时忽略其他终止条件)。
问题:从使用gprof
进行分析时,看起来花了很多时间来阅读和处理输入,而不是在程序的其他地方,这通常是有效的。为了提高性能,我想探索减少这个程序的总I / O开销,我正在使用非常大的(多GB)输入。
问题:也许最小化重新填充是将文件I / O降至最低的一种方法。是否存在(平台无关的)方法来调整FILE
指针使用的内部缓冲区的大小,还是需要使用自己的缓冲区编写自定义fgets()
类似的函数?在解析文本文件时是否还有其他策略可以减少总体I / O开销(搜索,读取等)?
注意:我道歉但是我没有说明我正在使用哪种流 - 我应该更清楚地说明我的应用程序从stdin
(标准输入)读取以及常规文件。
答案 0 :(得分:4)
setbuf(3)
系列函数允许您指定FILE*
的缓冲。
具体来说,setbuffer
和setvbuf
允许您分配一个您分配的与文件关联的缓冲区。或者,您只需指定大小为malloc
ed。
另请参阅Controlling Buffering上的GNU libc文档。