首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以较小、更频繁的读取或一次较大读取的方式读取输入

以较小、更频繁的读取或一次较大读取的方式读取输入
EN

Stack Overflow用户
提问于 2014-07-26 01:22:01
回答 2查看 31关注 0票数 0

我当时正在做一个C++教程练习,要求计算文件中的字数。这让我开始思考读取输入的最有效方法。一次读取整个文件的效率比读取小块(逐行或逐字符)的效率高多少?

EN

回答 2

Stack Overflow用户

发布于 2014-07-26 01:28:28

答案会根据您如何执行I/O而有所不同。

如果您使用的是POSIX open/read/close系列,那么一次读取一个字节将是非常痛苦的,因为每个字节将花费一个系统调用的成本。

如果您使用的是C fopen/fread/fclose系列或C++ iostream库,一次读取一个字节仍然不是很好,但它要好得多。这些库保留了一个内部缓冲区,并且仅在它运行枯竭时调用read。然而,由于您正在为每个字节做一些非常微不足道的事情,因此每次调用的开销可能仍然会使您实际必须进行的每个字节的处理相形见绌。但是测量一下,然后自己去看看。

另一种选择是简单地mmap整个文件,并在此基础上执行您的逻辑。您可能会注意到,也可能不会注意到使用和不使用MAP_POPULATE标志的mmap之间的性能差异。再说一次,你必须测量它,看看。

票数 2
EN

Stack Overflow用户

发布于 2014-07-26 02:15:18

最有效的I/O方法是保持数据流动。

也就是说,读取512个字符的块要快于读取1个字符的512个字符。您的系统可能已经进行了优化,例如缓存,以使读取速度更快,但您仍然有所有这些函数调用的开销。

有不同的方法来保持I/O的流动:

特定于buffering

  • Platform的
  • 内存映射文件I/O

一些简单的实验应该足以进行演示。

创建一个1兆字节的向量或数组。

启动计时器。

重复1000次:

使用1条Read指令将数据读入容器。

结束计时器。

重复,使用for循环,读取1,000,000个字符,每个字符有一条读取指令。

比较你的数据。

详细信息

对于来自硬盘的每个请求,将执行以下步骤(取决于平台优化):

为指定磁道和扇区的字节requested.

  • Seek的逻辑位置启动硬盘驱动器directory.

  • Search文件系统filename.

  • Get目录。
  • 将1个或多个扇区的数据读取到硬盘驱动器中,并将硬盘驱动器内存的请求部分读到硬盘驱动器的platform.
  • Spin中。

这称为开销(除非它读取扇区)。目标是在硬盘旋转时获得尽可能多的数据传输。启动硬盘需要比保持旋转更多的时间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24961194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档