在C ++中使用fread时,实现固定大小缓冲区的最佳方法是什么?

时间:2014-10-14 19:47:52

标签: c++ performance fread

假设您有一个整数文件,并且您希望逐个阅读它们。

您有两种缓冲选项。

  1. 声明大小为buffer的数组N并使用setvbuf告诉fread要使用哪个缓冲区。然后在调用函数fread读取整数时,请编写fread(&myInt, sizeof(myInt), 1, inputFile);

  2. 声明相同的数组buffer,但这次不使用函数setvbuf。而是自己做缓冲。所以请致电fread(buffer, bufferSize*sizeof(int), 1, inputFile)

  3. 根据我的理解setvbuf存在让您的生活更轻松,但这是否需要付出代价?您会在性能方面使用哪种方法?

1 个答案:

答案 0 :(得分:1)

我不会使用你的例子。我不认为I / O的一部分是性能瓶颈。

vbuf是输入例程在将数据放入目标之前放置的区域。它可以用作缓存或预格式化缓冲区。

大多数情况下,I / O瓶颈与获取的数据量和提取次数有关。例如,一次读取一个字节比读取字节块效率低。

另一个与I / O相关的瓶颈是输入请求之间的持续时间。 I / O设备更喜欢不间断地保持流数据。某些输入设备(如硬盘驱动器)在收到请求和数据开始传输之间有一段开销时间。对于硬盘驱动器,这将是磁盘加速时间。

您的最佳表现不是浪费开发时间来搞乱C或C ++库。您需要使用硬件辅助。某些平台有一个称为直接内存访问控制器(DMA)的设备。该设备可以从输入源获取数据,并在不使用CPU的情况下将其传送到存储器。当DMA传输数据时,CPU可以执行指令。要使用硬件辅助,您需要在OS驱动程序级别编写代码,或直接访问OS驱动程序。

C和C ++ I / O库设计用于称为流的独立于平台的概念。可能存在与此相关的执行开销(例如额外缓冲)。如果您不关心不同的平台,请直接访问操作系统驱动程序。

不要浪费你的时间搞乱C和C ++库。那里没有太大的性能提升。更多性能在于直接访问OS驱动程序(或使用您自己的驱动程序)。访问I / O的方式和时间将比调整C和C ++库显示出更大的性能提升。

最后,有效地使用处理器数据缓存也会获得性能。