假设您有一个整数文件,并且您希望逐个阅读它们。
您有两种缓冲选项。
声明大小为buffer
的数组N
并使用setvbuf
告诉fread
要使用哪个缓冲区。然后在调用函数fread
读取整数时,请编写fread(&myInt, sizeof(myInt), 1, inputFile);
声明相同的数组buffer
,但这次不使用函数setvbuf
。而是自己做缓冲。所以请致电fread(buffer, bufferSize*sizeof(int), 1, inputFile)
根据我的理解setvbuf
存在让您的生活更轻松,但这是否需要付出代价?您会在性能方面使用哪种方法?
答案 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 ++库显示出更大的性能提升。
最后,有效地使用处理器数据缓存也会获得性能。