最有效的打印方法" test"?

时间:2017-07-28 18:24:14

标签: c

在消耗最少量资源的同时打印内容。

它甚至可以是01,不一定是test

fputs("test",stdout);
printf("%s", "test");
puts("test");

上述哪一项命令效率最高?

还有其他更高效的东西吗?

2 个答案:

答案 0 :(得分:5)

三种备选方案之间的执行时间基本没有区别,一些优化编译器实际上会将printf转换为fputs之类的调用。因此,选择以您认为最清晰的方式做您想做的事情。

请注意puts("test");在单词后面写了换行符。如果你想要换行,那么这可能是最干净的解决方案。如果您不想要换行,请使用其他两个中的一个。

在尝试优化代码时,请关注整体情况。你使用最好的算法吗?你在做不必要的工作吗?你能用更好的数据结构吗?相信编写编译器和标准库的人在优化常用习语方面做得很好。他们是优秀的程序员,他们的工作是专注于使您的代码运行得更快的小细节。

答案 1 :(得分:2)

这里基本上有两个答案。

(1)对于几乎所有实际目的,之间存在 no 性能差异(时间或其他资源)

puts("test");
fputs("test\n",stdout);
printf("%s\n", "test");
fprintf(stdout, "%s\n", "test");

(如图所示,在换行处理方面存在一些差异。)

使用最清晰的,对你的程序有意义的;不要担心这里的效率。

(2)任何形式的问题"哪些是最快的?"只能在特定环境的背景下回答,并且通常无法预测。如果您真的关心,除了在您的确切环境中进行经验测试之外,您基本上没有其他选择。请注意,由于性能差异可能很小(参见答案1),您可能必须执行数千或数百万次测试才能获得统计上显着的答案 - 这几乎强调了这一点,实际上,任何差异可能都不重要。

现在,为了好玩,我进行了测试。这是一个测试所有四个备选方案的小程序,以及低级write系统调用:

#include <stdio.h>
#include <time.h>

int main()
{
    int count = 100000000;
    time_t t1, t2;
    int delta;
    int i;

    t1 = time(NULL);

    for(i = 0; i < count; i++) puts("test");

    t2 = time(NULL);
    delta = (int) t2 - t1;

    fprintf(stderr, "test 1: %d secs (%f prints/sec)\n",
        delta, (double)count/delta);

    t1 = t2;

    for(i = 0; i < count; i++) fputs("test\n", stdout);

    t2 = time(NULL);
    delta = (int) t2 - t1;

    fprintf(stderr, "test 2: %d secs (%f prints/sec)\n",
        delta, (double)count/delta);

    t1 = t2;

    for(i = 0; i < count; i++) printf("%s\n", "test");

    t2 = time(NULL);
    delta = (int) t2 - t1;

    fprintf(stderr, "test 3: %d secs (%f prints/sec)\n",
        delta, (double)count/delta);

    t1 = t2;

    for(i = 0; i < count; i++) fprintf(stdout, "%s\n", "test");

    t2 = time(NULL);
    delta = (int) t2 - t1;

    fprintf(stderr, "test 4: %d secs (%f prints/sec)\n",
        delta, (double)count/delta);

    t1 = t2;

    for(i = 0; i < count; i++) write(1, "test\n", 5);

    t2 = time(NULL);
    delta = (int) t2 - t1;

    fprintf(stderr, "test 5: %d secs (%f prints/sec)\n",
        delta, (double)count/delta);
}

您会注意到我选择运行每次一亿次的测试。 (当我说'#34;你可能不得不进行数千或数百万次测试时,我不开玩笑#34;。)尽管如此,结果如下:

test 1: 9 secs (11111111.111111 prints/sec)
test 2: 8 secs (12500000.000000 prints/sec)
test 3: 17 secs (5882352.941176 prints/sec)
test 4: 16 secs (6250000.000000 prints/sec)
test 5: 45 secs (2222222.222222 prints/sec)

所以,从某种意义上说,我的回答(1)是错误的。区别是:putsfputs的速度是printffprintf的两倍,至少在我的机器上是这样。但是,为了看到这种差异,我不得不称他们为一亿次这一事实表明,在现代机器上,如果你只做了几十,几百或几千甚至数百万或数千万的电话,你可能根本没有看到任何差异。

[P.S。我的测试程序不是严格便携的。我应该使用long int作为计数器。]