【问题标题】:Is write() or printf() better? [closed]write() 或 printf() 更好吗? [关闭]
【发布时间】:2012-12-25 16:14:02
【问题描述】:

printf 更好,因为 ...

  • 它缓冲输出
  • 它进行字符串格式化

写得更好,因为...

  • 不必计算字符串长度
  • 它不缓冲,调试起来容易得多
  • printf 只是 write 的包装器
  • 它不使用任何内存作为输出缓冲区
  • 由于上述原因,与使用 printf 相比,通过传递字符串长度(通常已知且无需重新计算)和在内部管理一个缓冲区(它只占用实际需要的内存,而不是一些不受程序员影响的内存)。
  • 即使只使用非格式化字符串调用 printf(),也可能存在一些开销

总而言之,我认为 printf() 更适合用于人类消费的各种调试输出(因为字符串格式),而 write() 更适合在正常操作中输出数据。

还有什么想法吗?

【问题讨论】:

  • 这是一个相当宽泛的问题,答案比较固执。
  • write() 不缓冲?在stdout?你是认真的吗?
  • 另外,哪个更好? curl_easy_init()archive_create()?
  • write(2) 系统调用没有缓冲,内核可能有一些文件系统缓存(但这些“缓冲区”保留在内核中,而不是在应用程序中)
  • 不,内核中的文件系统缓存与文件系统和整个文件机制相关联。每个单独的文件在文件系统缓存中没有特定的缓冲区,但可能以块的形式存在。

标签: c optimization


【解决方案1】:

它实际上取决于操作系统。在 Linux 和许多 Unix 上,write(2) 是一个低级的 syscall,所以是基本的、最低级的操作来做一些输出。 (而printf 是在write 之上构建的库函数)。

但是,write(2) 操作确实有开销,并且出于性能原因,您希望缓冲输出,<stdio.h> 标准函数(如printf)做得很好。简单来说,避免使用少量数据调用write(2)(一个好的缓冲区大小通常是几千字节)。 fflush 库函数正在刷新缓冲区(因此可以调用 write)。

【讨论】:

    猜你喜欢
    • 2020-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 2011-01-05
    • 2010-11-24
    相关资源
    最近更新 更多