AWK 是否在将多个打印语句写入光盘之前对其进行缓冲?

Does AWK Buffer Multiple Print Statements Before Writing Them to Disc?

我有一个 AWK 脚本,可以将数万行相当长的行写入几个文件,并将近万行写入网络驱动器上的更多文件(不同目的都需要)。出于某些原因,我想让文件 I/O 尽可能高效。

AWK 是立即将每个 print(f) 语句写入文件还是缓冲它们?如果是这样,需要多少缓冲?

我正在考虑将所有内容写入缓冲区(例如,rec1 "\n" rec2 "\n" rec3...),然后使用单个打印命令将其全部转储,但如果没有,则不会净收益。

我很好奇,不仅仅是为了这个程序,也是为了磨练我的“最佳实践”技能。我用 AWK 编写了很多程序,但还没有找到答案。

提前致谢...

是的,正如您在 GNU Awk manual: I/O functions. Actually that is why fflush (accepted for inclusion in POSIX) exists: to flush the buffers. And here some practical evidence 中看到的那样。

正如@Quasimodo 指出的那样,是的,awk 会缓冲它的默认输出,如果你愿意,你可以通过插入 fflush() 语句来绕过它。

对于您问题的另一部分 (I am considering writing everything to a buffer (e.g., rec1 "\n" rec2 "\n" rec3...) and then dumping it all with a single print command, but not if it won't have a net benefit.) - 在 awk 中使用字符串连接不断地附加到一个变量大致和 I/O 一样慢,因为 awk 必须不断地寻找新的大内存区域足以容纳串联的结果,然后将旧位置的内容移动到新位置,然后附加新文本,然后释放先前的区域,因此缓冲和打印的执行速度不会有明显的好处一次全部打印 vs 随手打印。