if-else或者只是声明 - 如果是条件值

时间:2013-06-19 07:49:03

标签: python c performance compiler-construction

假设我有一个取决于条件的变量。从效率的角度来看,我应该使用

int s;
if (d > 2)
{
   s = -1;
}
else
{
   s = 1;
}

或只是

int s = 1;
if (d > 2)
{
   s = -1;
}

有人可以解释一下这个区别吗?编译语言(例如C)与解释语言(例如Python)之间是否有任何区别?

请注意,这个问题与我的previous question有关,我问的原因是相同的:它在任何编程语言中都非常频繁,我总是问自己应该使用什么

7 个答案:

答案 0 :(得分:1)

没有区别,优化gcc -S -O2会给出相同的输出:

    .file   "demo.c"
    .section    .rodata.str1.1,"aMS",@progbits,1
.LC0:
    .string "%d"
    .section    .text.startup,"ax",@progbits
    .p2align 4,,15
    .globl  main
    .type   main, @function
main:
.LFB11:
    .cfi_startproc
    subq    $8, %rsp
    .cfi_def_cfa_offset 16
    movl    $-1, %esi
    movl    $.LC0, %edi
    xorl    %eax, %eax
    call    printf
    xorl    %eax, %eax
    addq    $8, %rsp
    .cfi_def_cfa_offset 8
    ret
    .cfi_endproc
.LFE11:
    .size   main, .-main
    .ident  "GCC: (Debian 4.7.2-5) 4.7.2"
    .section    .note.GNU-stack,"",@progbits

答案 1 :(得分:1)

如果您在初始化为1-1的情况下确实有大量此类代码,并且它实际运行了很多次以致可能影响性能,则可以使用无分支版本:

int s = 1 - 2*(d > 2);

更一般地说,您可以为初始化值设置数组:

const int s_ini[2] = { 1, -1 };
int s = s_ini[d > 2];

答案 2 :(得分:1)

在这种情况下,我个人更喜欢(有时可怕的)三元运算符?:,如下所示:

const int s = (d < 2) ? -1 : 1;

自:

  1. 这允许sconst,在我看来这是一个巨大的胜利。当然,这假设变量只在初始化后才被读取。
  2. 它(像其他解决方案一样)只会写入s一次,这可能会更快。
  3. 我通过计算避免了“聪明的伎俩”。

答案 3 :(得分:1)

我的的角度来看, 是一个性能问题。大多数编译器将生成相同的代码,如果不生成,则不会产生任何明显的性能影响。除非您在非常(非常)紧密的环境中工作,每个CPU周期都在这里。不应该是这种情况,除非你是一个从七十年代到来的时间旅行者......

更严重的是,由于在各种评论中多次注意到,这更多的是可读性通信。在那之后,很难说一个表格更好而不是另一个。

个人习惯是使用if ... else ...当我想强调一个事实时,程序中显然有两条不同的“重量”路径。当我想说“嗯,set to default; if ...特殊案例”时,我会使用替代if

由于这与您的其他问题有关,因此您可能会将表单视为某种guard clause,例如if ... return ...; return ...

答案 4 :(得分:0)

性能差异并不重要,但您的第一个符号对于其他程序员来说最为明显。

int s;
if (d > 2)
   s = -1;
else
   s = 1;

当程序员将“int s = 1;”时他可能不明白为什么你把这个变量初始化为1,因为它之后是-1两个lignes。

答案 5 :(得分:0)

在这种情况下没有对错。这取决于。我相信即使运行时间可能略有不同,您也应该总是更喜欢代码可维护性。

在这种情况下,默认值更好,因为您必须通过所有条件才能成功返回。

    int rc = FAIL;

    /* do something */

    if (some-cond)
        goto end;

    /* do something */

    if (some-cond)
        goto end;

    rc = SUCCESS;

end:
    /* clean-up */
    return rc;

答案 6 :(得分:0)

从代码的可读性来看,我认为前者更好。如果你想获得更好的表现,我认为你可以做@jxh答案。