0

“设置变量”和“检查条件后设置变量”之间是否存在速度差异?

那么是不是更好用

    if (state != IDLE) {
       state = IDLE;
    }

代替

    state = IDLE;

?

在第一种情况下,检查标志需要一些时间。但是这个持续时间可以与第二种情况(只需设置一个变量)进行比较吗?一般哪个更快?

谢谢,马丁

编辑:该程序将在接收 CAN 消息的 IRQ 处理程序内以 120 MHz 的微控制器(NXP LPCXpresso 1769)上运行。我问的原因是因为我不希望 IRQ 处理程序妨碍正常的程序执行。

4

3 回答 3

2

简单的答案是,在大多数情况下,仅写入值将至少与先测试一样快,而且通常更快。

更详细的解释:除了非常低端的微控制器,内存总线通常会与内核分离。当您首先测试时,CPU 必须将地址写入内存总线,然后等待内存响应,然后才能真正查看该值。

当您进行写入时,CPU 通常只会将地址/值放入写入队列,然后移至下一条指令。尽管涉及内存事务,但执行其他指令不会等待它完成(除非他们读取该值 - 在这种情况下,它将取决于 CPU 是否有缓存;如果有,它会以最小的延迟从缓存中读取值,否则它通常会等待它被写入内存然后再读回它)。

于 2012-06-10T17:35:37.670 回答
1

理论上:

您的第一个示例有两个操作,

  1. 检查状态
  2. 修改状态

你的第二个例子有一个操作,

  • 修改状态

所以在数学/逻辑上,显然第一个示例比第二个示例要快,因为要执行的操作少了一个。

几乎:

根据使用的变量,智能编译器可以优化第一个示例和第二个示例以生成相同的汇编指令。
所以两者可能具有相同的性能。

准确判断:

通过使用代表性数据集来分析您的应用程序/代码只有这样您才能获得正确的图片和比较。

于 2012-06-10T17:35:47.033 回答
1

由于第一个片段涉及“读取、比较、写入”,而第二个片段只是“写入”,因此第二个片段的未优化代码将比第一个片段更快,因为选项较少。如果变量用 限定volatile,则第一个必须比第二个慢。如果变量没有用 限定volatile,编译器可以优化第一个到第二个,因为两个序列的结果将是相同的,而不管赋值之前变量中的内容是什么。

于 2012-06-10T17:38:55.773 回答