我正在进行一项C ++教程练习,要求计算文件中的单词数。它让我想到了阅读输入的最有效方法。一次读取整个文件比读取小块(逐行或逐字符)更有效率吗?
答案 0 :(得分:2)
答案会根据您进行I / O的方式而改变。
如果您使用的是POSIX open
/ read
/ close
系列,那么一次读取一个字节将会非常难以忍受,因为每个字节都会花费一个系统调用。
如果您使用的是C fopen
/ fread
/ fclose
系列或C ++ iostream
库,则一次读取一个字节仍然不是很好,但它好多了。这些库保留一个内部缓冲区,只在它运行干燥时调用read
。但是,由于您为每个字节执行的操作非常简单,因此每次调用开销仍然可能使您实际需要执行的每字节处理相形见绌。但要衡量它并亲自看看。
另一种选择是简单地mmap
整个文件,然后就此做你的逻辑。您可能会,也可能不会注意到mmap
与MAP_POPULATE
标志之间的性能差异。同样,你必须测量并看到它。
答案 1 :(得分:0)
最有效的I / O方法是保持数据流动。
也就是说,读取一个512个字符的块比读取1个字符的512个块快。您的系统可能已经进行了优化(例如缓存)以使读取速度更快,但您仍然需要所有这些函数调用的开销。
有不同的方法来保持I / O流动:
一些简单的实验应该足以进行演示。
创建1兆字节的向量或数组
启动计时器
重复1000次:
使用1条读取指令将数据读入容器
结束计时器。
使用for循环重复读取1,000,000个字符,每个字符读取1条指令。
比较您的数据。
<强>详情
对于来自硬盘驱动器的每个请求,将执行以下步骤(取决于平台优化):
这称为开销(除非它读取扇区)。 目标是在硬盘驱动器旋转时获取尽可能多的数据。启动硬盘需要花费更多时间,而不是让它继续旋转。