fputs比格式更有效("%s",..)?

时间:2014-12-30 11:23:48

标签: c format stdio

在C代码中

printf("%s", message);

我想知道是否应该使用

fputs(message, stdout);

以前的代码更清晰但速度更慢?或者使用更多内存?我更喜欢更清晰的代码,但是当它看起来像浪费时间和时间时却没有。记忆愚蠢。

我很想知道编译器检测到这种情况,并且在运行时没有完成必要的格式解析和解释。毕竟,gccprintf("")上抱怨,因此编制者可以“理解”格式并对其进行预处理。

PS:在编写format("name=%s\n",unameData.nodename);而不是写fputs(stdout,"name=");fputs(stdout,unameData.nodename);putchar('\n');时,前一种风格更清晰更明显 {{1}}。这是具有格式的所有目的。

2 个答案:

答案 0 :(得分:5)

根据实施情况,其中一种可能更有效。

通过适当的优化标志,不错的编译器应该能够在没有程序员知识的情况下将效率较低的表单更改为另一个(假设printf("%s\n", message))。

$ cat print.c 
#include <stdio.h>

int main()
{
    printf("%s\n", "Hello world");
    return 0;
}

$ gcc -S -O2 print.c 
$ cat print.s 
    .file   "print.c"
    .section    .rodata.str1.1,"aMS",@progbits,1
.LC0:
    .string "Hello world"
    ...   
    movl    $.LC0, (%esp)
    call    puts
    xorl    %eax, %eax
    leave
    ...

...表示为简洁而省略的代码

答案 1 :(得分:2)

虽然理论上可能是正确的,但在实践中printf函数几乎总是有更高的成本:

  • printf函数是变量参数函数,它限制了编译器可以使用的调用约定。这导致更多的程序存储器使用,因为清理总是在调用者代码上。代码也可能更慢,因为参数必须在堆栈而不是寄存器上传递。

  • 由于这些函数的复杂性,
  • printf函数往往具有更高的堆栈使用率。

虽然某些编译器可能会在可能的情况下检测到printf并使用puts,但实际上嵌入式系统的编译器并不总是那么聪明,在这种环境中,差异确实很重要。