printf减慢我的程序
我有一个小型的C程序来计算哈希(对于哈希表)。 我希望代码看起来很干净,但有一些与我无关的东西无关。
我可以在大约0.2-0.3秒内轻松生成约一百万个哈希(以/ usr / bin / time为基准)。 但是,当我将printf()放入for循环时,程序会减速到大约5秒钟。
我期待着有趣和详细的答复。 谢谢。
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,它都应该同样缓慢。
课程 :运行输出密集型程序时,切换到另一个TTY!
无缓冲输出非常缓慢。
默认情况下, stdout
是完全缓冲的,但是当连接到终端时, stdout
可以是无缓冲的或行缓冲的。
尝试使用setvbuf()
开启缓冲stdout
,如下所示:
char buffer[8192];
setvbuf(stdout, buffer, _IOFBF, sizeof(buffer));
您可以将您的字符串存储在缓冲区中,并在缓冲区已满时定期或者定期将其输出到文件(或控制台)。
如果输出到控制台,滚动通常是一个杀手。
如果你是printf()控制台,它通常非常慢。 我不知道为什么,但我相信它不会返回,直到控制台以图形方式显示输出的字符串。 此外,您不能将mmap()标准输出到标准输出。
写入文件应该快得多(但仍然比计算散列慢几个数量级,所有I / O都很慢)。
链接地址: http://www.djcxy.com/p/85413.html