假设我有一个取决于条件的变量。从效率的角度来看,我应该使用
int s;
if (d > 2)
{
s = -1;
}
else
{
s = 1;
}
或只是
int s = 1;
if (d > 2)
{
s = -1;
}
有人可以解释一下这个区别吗?编译语言(例如C)与解释语言(例如Python)之间是否有任何区别?
请注意,这个问题与我的previous question有关,我问的原因是相同的:它在任何编程语言中都非常频繁,我总是问自己应该使用什么
答案 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;
自:
s
为const
,在我看来这是一个巨大的胜利。当然,这假设变量只在初始化后才被读取。s
一次,这可能会更快。我通过计算避免了“聪明的伎俩”。
答案 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答案。