printf减慢我的程序

我有一个小型的C程序来计算哈希(对于哈希表)。 我希望代码看起来很干净,但有一些与我无关的东西无关。

我可以在大约0.2-0.3秒内轻松生成约一百万个哈希(以/ usr / bin / time为基准)。 但是,当我将printf()放入for循环时,程序会减速到大约5秒钟。

  • 为什么是这样?
  • 如何让它更快? mmapp()ing stdout也许?
  • 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,它都应该同样缓慢。


    课程 :运行输出密集型程序时,切换到另一个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

    上一篇: printf slows down my program

    下一篇: is there such a thing?