【问题标题】:What is the best way to send large amount of strings to stdout?将大量字符串发送到标准输出的最佳方法是什么?
【发布时间】:2014-01-24 09:25:53
【问题描述】:

我有一个函数返回指向包含 4 个字符的 char 的指针。

char *foo(unsigned short n)
{
    return "abc\n";
}

现在我运行它 100 000 次并将结果发送到标准输出。而且必须尽可能以最快的方式完成。
在不写入的情况下运行此函数 100 000 次大约需要 0.45 秒。
我试过的:

  • printf
    ... 
    printf("%s", foo(n));
    ... 

~6.5s

  • 写入
    ...
    fwrite(foo(n), 4, 1, stdout); 
    ...   

~9.9s

  • strncat 用于缓冲和写入
    char buffer[400001] = "";
    ... 
    strncat(buffer, foo(n), 4);
    ... 
    fwrite(buffer, 400000, 1, stdout); 

~7s

有没有办法让它更快?我希望至少低于 5 秒。

【问题讨论】:

  • 你忘记 puts() (每行)或 puch() 循环...
  • 如果您对程序进行计时,您可能会发现它实际上只使用了几毫秒的 CPU 时间。其余的都是由于您的输出终端处理文本的速度。 .. 为什么需要在屏幕上打印这么多数据?你不能读那么快,对吗?
  • 我不相信这些数字。以./a.out > /tmp/out.txt 运行它以获得更真实的度量(甚至首先重定向到/dev/null)。
  • 如果你只有一个固定的字符串,肯定是fputs 而不是fprintf
  • 作为替代方案,您甚至可以检查无缓冲 I/O(以防万一)

标签: c char stdout


【解决方案1】:

在您的善良 cmets 之后,我进行了更多测试,结果发现 fputs() 是最快的。 > out.txt 为 ~0.45s,> NUL 为 ~0.61s。所以事实证明,控制台输出正在减慢一切。

【讨论】:

    猜你喜欢
    • 2013-12-11
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 2017-05-31
    • 2020-06-20
    相关资源
    最近更新 更多