【问题标题】:Faster Condition Checking [closed]更快的条件检查[关闭]
【发布时间】:2014-10-22 08:45:11
【问题描述】:

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

第一个密码:

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

第二个密码:

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

第三码:

if (x)
{
   y = 10;
}

【问题讨论】:

  • 我会说这是完全相同的执行时间
  • 它们可能相同,但这取决于 CPU 和编译器。为什么不让编译器生成程序集(可能是-S 选项),或者反汇编编译结果并检查?
  • @BartekBanachewicz 您假设类型和标头甚至存在于 OP 的编译器中。
  • @lurker 编程语言 C 由 ISO/IEC JTC1/SC22/WG14 标准定义。在谈论 C 时,最新标准 (ISO/IEC 9899) 应该有效,除非另有明确说明。
  • 我已经在不同平台上尝试过这段代码,并且已经获得了不同的性能。 @lurker 你能分享一下你对 Y 的担忧吗?

标签: c performance microcontroller computer-architecture


【解决方案1】:

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

【讨论】:

  • 如果x是之前计算的结果,编译器可以直接根据第二种情况下剩余的零标志进行跳转。在第一种情况下,需要进行比较。
  • @Quentin 当然,除非编译器知道 x 是布尔值。这个问题暗示它是(否则三个选项将不等价),尽管编译器可能无法辨别/利用这一事实。
【解决方案2】:

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

第一个代码将转换为:

LDAA  x
CMPA  #1
BNE   loc
...

这会将x 加载到寄存器中,将寄存器与1 进行比较,然后在相等时跳转。

第二个代码将转换为:

LDAA  x
BNE   loc

x 加载到寄存器中会设置零标志,因此可以立即将相等跳转到零。这节省了两个字节的代码内存和两个 CPU 周期。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2020-02-05
    • 1970-01-01
    • 2021-04-25
    相关资源
    最近更新 更多