比行缓冲更好的输出方式:既要及时,也要够快
来源:nullprogram.com — 2026-11-05
📋 概述
缓冲输出通常有两种:全缓冲与行缓冲。输出到终端时默认用行缓冲,每完成一行就 flush;其他情况全缓冲,攒满或等到某个不确定的时刻才写。行缓冲是非交互终端程序的常见瓶颈,以至于为了绕开它会专门把输出重定向到文件或管道。作者认为不必如此,可以两头都要:既及时把整行送到终端,又保持全缓冲的速度。他用 strace 展示了现状有多粗糙——glibc 的行缓冲是字面意义上的按行,甚至会把一次 puts 的字符串拆成多次 write,而 CPython 的规则是「追加新输出后如果缓冲区里有换行就 flush」,代价是可能输出半行。文章随后给出一个自己的缓冲区结构,用标志位区分错误与行缓冲,并推导出既能保持整行交付、又不额外系统调用的写策略。
🔑 核心要点
- 行缓冲是终端程序常见瓶颈,严重时把输出重定向到文件反而更快。
- glibc 的行缓冲按行字面切分,连一次 puts 的字符串都会被拆成多次 write。
- CPython 的规则是缓冲区含换行就 flush,结果是可能输出半行。
- 作者给出的方案在保持整行及时送达的同时,把写次数压回全缓冲水平。
💡 金句
We can have our cake and eat it, too: promptly delivering lines to a terminal at fully-buffered speeds.
👍 0
👎 0
← 返回 Hacker News 首页