C 更快的状态检查

C 更快的状态检查,c,performance,microcontroller,computer-architecture,C,Performance,Microcontroller,Computer Architecture,以下代码执行相同的逻辑(x仅为0或1)。 哪种代码执行得更快 第一个代码: if (x == 1) { y = 10; } if (x != 0) { y = 10; } if (x) { y = 10; } 第二个代码: if (x == 1) { y = 10; } if (x != 0) { y = 10; } if (x) { y = 10; } 第三个代码: if (x == 1) { y = 10; } if (x != 0)

以下代码执行相同的逻辑(x仅为0或1)。 哪种代码执行得更快

第一个代码:

if (x == 1)
{
   y = 10;
}
if (x != 0)
{
   y = 10;
}
if (x)
{
   y = 10;
}
第二个代码:

if (x == 1)
{
   y = 10;
}
if (x != 0)
{
   y = 10;
}
if (x)
{
   y = 10;
}
第三个代码:

if (x == 1)
{
   y = 10;
}
if (x != 0)
{
   y = 10;
}
if (x)
{
   y = 10;
}

您可能想对其进行测量,但很可能这两者在速度方面完全相同(在机器代码级别上,它们非常相似)。

这取决于体系结构。在许多8位微控制器上,比较零需要一条指令,而比较零以外的特定数字需要两条指令

第一个代码将转换为:

LDAA  x
CMPA  #1
BNE   loc
...
LDAA  x
BNE   loc
这会将
x
加载到寄存器中,将寄存器与
1
进行比较,然后跳转到相等

第二个代码将转换为:

LDAA  x
CMPA  #1
BNE   loc
...
LDAA  x
BNE   loc
x
加载到寄存器中会设置零标志,因此可以立即将相等值跳到零。这样可以节省两个字节的代码内存和两个CPU周期


您可以通过将一个小样本编译成汇编,或者通过反汇编实际代码来检查您的平台上是否发生了这种情况。

我想说,它们的执行时间完全相同,但这取决于CPU和编译器。为什么不让编译器生成汇编(
-S
选项),或者反汇编并检查编译结果?@BartekBanachewicz您假设类型和头甚至存在于OP的编译器中。@潜伏编程语言C是由ISO/IEC JTC1/SC22/WG14标准定义的。最新的标准(ISO/IEC 9899)应该在谈论C时生效,除非另有明确说明。我已经在不同的平台上尝试过这段代码,并且已经获得了不同的性能@潜伏者请你分享你对Y的担忧好吗?如果x是先前计算的结果,编译器可以在第二种情况下直接基于剩余零标志跳转。在第一种情况下,需要进行比较。@Quentin,当然,除非编译器知道x是布尔值。这个问题意味着它是(否则这三个选项将不相等),尽管编译器可能无法识别/利用这一事实。