标准IO的效率

在这里插入图片描述

对于这3个标准 I/O 版本中的每一个,其用户CPU时间都大于 图3-6 的最佳 read 版本,因为在每次读一个字符的标准 I/O 版本中有一个要执行 1 亿次循环,而在每次读一行的版本中有一个要执行 3144984 次的循环。在 read 版本中,其循环只需执行 25224 次(对于缓冲区长度为 4096 字节)。因为系统的CPU时间几乎相同,所以用户CPU时间的差别以及等待 I/O 结束所消耗时间的差别造成了时钟时间的差别。

  1. 系统 CPU 时间几乎相同,原因是因为所有这些程序对内核提出的读、写请求数基本相同。注意:

    • 使用标准I/O例程的一个优点是无须考虑缓冲及最佳IO的选择。在使用 fgets() 时需要考虑最大行长
  2. 由最后一列知:使用 getc() 和 putc() 实现的版本与 fgetc 和 fputc 的版本在文本空间长度方面大体相同。

  3. 使用每次一行I/O版本的速度大约是每次一个字符版本速度的两倍,若fgets 和 fputs 是用 getc 和 putc 实现的,那么预期时间会相近,每次一行的版本甚至更慢一些,因为还需增加额外函数调用。但是fgets和fputs是用 memccpy 实现的。通常为了提高效率,memccpy 函数用汇编语言而非C语言编写,正因为如此,每次一行的版本才会有较高的速度。

  4. 最后一个有趣之处在于:fgetc 版本较图 3-6 中 buffsize == 1 的时间大大减少。这是因为系统调用与普通的函数调用相比要花费更多的时间

猜你喜欢

转载自blog.csdn.net/qq_22473333/article/details/114377066