我相信这是一个非常简单的问题,但我真的不确定该使用什么搜索参数,所以我要在这里提问。
比方说,当X和Y都为真时,我有要执行的代码,我希望它尽可能高效。我知道有两种方法可以做到这一点;
if(X)
if(Y)
//do stuff
或者有:
if(X && Y)
//do stuff
我想知道的是,这些代码在运行时是如何读取和执行的?如果X不是真的,那么根本不检查Y是否更有效?还是同时对X和Y执行检查更有效?显然,第二个对人类来说更可读,但如果唯一的目标是效率,那哪个更好?
谢谢!
第一种情况比第二种更有效。
第一种情况下的ASM代码将低于类型。
ax = A
if ax=0 goto address
ax = B
if ax = 0 goto adress
Do something
address:
..........................
但是第二种情况的ASM代码将低于类型。
ax = A
bx = B
ax = A & B
if ax=0 goto address
Do something
address:
...........................
在许多(大多数?(语言中,两者将完全相同。
如果您关心性能,我认为您使用的是一个好的、优化的编译器。任何优化编译器都应该意识到,当您编写时
if(X && Y)
如果X为假,则不需要浪费时间来评估Y.
这种所谓的短路行为是C和类C语言定义的一部分。
此外,如果你关心效率和性能,像这样的问题可能是你最不应该担心的。选择一种好的语言,一个好的编译器,并选择好的算法,这一点非常重要。融合低级别的编码细节,比如if (X) if(Y)
和if(X && Y)
,通常不会有太大区别。
此外,如果你真的很关心效率和性能,那么真正回答这些问题的唯一方法就是今天使用你的代码、编译器和计算机进行仔细的测量。
实际上,要进行良好的测量可能相当困难。通常,这两个选项似乎具有相同的性能,这是";微优化";通常根本不重要。