减少I/O和函数调用的开销是如此重要,以至于通过讨论便携式技术以降低其开销被证明具有充分的根据。I/O通常发生在毫秒级时间范围内,而CPU活动一般发生在亚微秒级的范围内。因此,对于算法的性能而言,任何I/O的代价都非常高昂。如果不能消除I/O本身,那么可以通过使用智能缓冲来减小它的影响。许多程序员把它看作创建和控制他们自己的缓冲区的动机,从而花费相当多的努力和代码来管理I/O缓冲区。ANSI C利用setvbuf() 函数提供了一种优雅的替代方案。这个可移植的函数可以让程序员为输入流设置缓冲区的大小。问题是缓冲区应该设置成多大才合适。对此,大多数编译器库倾向于将缓冲区大小设置为一个保守但是可以工作的大小。扩展缓冲区可以显著减少I/O次数。程序清单11中所示的程序bufsizec允许测试你自己的系统上最佳的缓冲区大小。它接受4个参数:要复制的测试文件、目标文件的名称、两个缓冲区大小(一个用于输入缓冲区、另一个用于输出缓冲区)。然后,程序把输入文件复制5次,并在命令行指定的缓冲区大小给出复制过程的最大、最小和平均持续时间。如同所编写的那样,该程序调用MSDOS的时钟并以时钟滴答次数报告计时。对于UNIX系统下的等价函数应该会有一些变化。作为替代,可以使用开始次数和结束次数,并报告时间(以秒为单位)。不过,以秒为单位将给出一个粗略的度量。程序清单11在MSDOS下测试最佳缓冲区大小的程序 图12显示了在多种缓冲区大小上运行这个程序的结果。垂直轴显示了复制64 KB文件的时间单位;水平轴以字节为单位显示了输入和输出缓冲区的大小。这张图是在真实模式下运行的MSDOS系统上生成的。它代表了在其他系统下的性能改善。当缓冲区大小为4 096字节时将达到最佳性能,而更大的缓冲区并没有带来明显的性能改善。事实上,对于大多数应用程序,其中最重要的需求并不是要求它们以最快的速度运行,此时 1 024字节的缓冲区大小是足够的。图12将I/O的性能作为缓冲区大小的函数,并以时钟滴答次数显示时间