我有一个小的 C 程序来计算哈希(用于哈希表)。我希望代码看起来很干净,但是有一些与它无关的东西困扰着我。
我可以在大约 0.2-0.3 秒内轻松生成大约一百万个哈希(以 /usr/bin/time 为基准)。但是,当我在 for 循环中对它们进行 printf() 处理时,程序会减慢到大约 5 秒。
- 为什么是这样?
- 如何让它更快?mmapp()ing 标准输出可能吗?
- stdlibc 在这方面是如何设计的,如何改进?
- 内核如何更好地支持它?需要如何修改它以使本地“文件”(套接字、管道等)的吞吐量真的很快?
我期待着有趣和详细的答复。谢谢。
PS:这是一个编译器构建工具集,所以不要害羞地进入细节。虽然这与问题本身无关,但我只想指出我感兴趣的细节。
附录
我正在寻找更多的解决方案和解释的程序化方法。确实,管道可以完成这项工作,但我无法控制“用户”的工作。
当然,我现在正在做一个测试,这是“普通用户”不会做的。但这并没有改变一个简单的 printf() 减慢进程的事实,这是我试图找到最佳编程解决方案的问题。
附录 - 惊人的结果
参考时间是针对 TTY 内的普通 printf() 调用,大约需要 4 分 20 秒。
在 /dev/pts(例如 Konsole)下进行测试可将输出加速到大约 5 秒。
在我的测试代码中使用 setbuffer() 到大小为 16384 所需的时间大致相同,对于 8192 几乎相同:大约 6 秒。
setbuffer()在使用时显然没有效果:它需要相同的时间(在 TTY 上大约 4 分钟,在 PTS 上大约 5 秒)。
令人惊讶的是,如果我在 TTY1 上开始测试然后切换到另一个 TTY上,它确实需要与 PTS 上相同的时间:大约 5 秒。
结论:内核做了一些与可访问性和用户友好性有关的事情。嗯!
通常,无论您是在 TTY 处于活动状态时盯着它看,还是切换到另一个 TTY,它都应该同样慢。
教训:运行输出密集型程序时,切换到另一个 TTY!