我当时正在做一个C++教程练习,要求计算文件中的字数。这让我开始思考读取输入的最有效方法。一次读取整个文件的效率比读取小块(逐行或逐字符)的效率高多少?
发布于 2014-07-26 01:28:28
答案会根据您如何执行I/O而有所不同。
如果您使用的是POSIX open/read/close系列,那么一次读取一个字节将是非常痛苦的,因为每个字节将花费一个系统调用的成本。
如果您使用的是C fopen/fread/fclose系列或C++ iostream库,一次读取一个字节仍然不是很好,但它要好得多。这些库保留了一个内部缓冲区,并且仅在它运行枯竭时调用read。然而,由于您正在为每个字节做一些非常微不足道的事情,因此每次调用的开销可能仍然会使您实际必须进行的每个字节的处理相形见绌。但是测量一下,然后自己去看看。
另一种选择是简单地mmap整个文件,并在此基础上执行您的逻辑。您可能会注意到,也可能不会注意到使用和不使用MAP_POPULATE标志的mmap之间的性能差异。再说一次,你必须测量它,看看。
发布于 2014-07-26 02:15:18
最有效的I/O方法是保持数据流动。
也就是说,读取512个字符的块要快于读取1个字符的512个字符。您的系统可能已经进行了优化,例如缓存,以使读取速度更快,但您仍然有所有这些函数调用的开销。
有不同的方法来保持I/O的流动:
特定于buffering
一些简单的实验应该足以进行演示。
创建一个1兆字节的向量或数组。
启动计时器。
重复1000次:
使用1条Read指令将数据读入容器。
结束计时器。
重复,使用for循环,读取1,000,000个字符,每个字符有一条读取指令。
比较你的数据。
详细信息
对于来自硬盘的每个请求,将执行以下步骤(取决于平台优化):
为指定磁道和扇区的字节requested.
这称为开销(除非它读取扇区)。目标是在硬盘旋转时获得尽可能多的数据传输。启动硬盘需要比保持旋转更多的时间。
https://stackoverflow.com/questions/24961194
复制相似问题