比较速度与设定变量

时间:2012-06-10 17:28:12

标签: c performance

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

使用

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

而不是

    state = IDLE;

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

谢谢, 马丁

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

3 个答案:

答案 0 :(得分:2)

简单的答案是,在大多数情况下,只需编写该值至少与首次测试一样快,并且通常比测试速度快。

更详细的解释:除了非常低端微控制器之外,内存总线通常会从内核中解除。首先进行测试时,CPU必须将地址写入内存总线,然后等待内存响应,然后才能实际查看该值。

执行写操作时,CPU通常只将地址/值放入写入队列,然后转到下一条指令。虽然涉及的内存事务,但执行其他指令不会等待它完成(除非他们读取该值 - 在这种情况下,它将取决于CPU是否具有缓存或不;如果是,它将以最小的延迟从缓存读取值,但是否则通常会等待它写入​​内存然后再读回来。

答案 1 :(得分:1)

理论上:

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

  1. 检查状态
  2. 修改状态
  3. 你的第二个例子有一个操作,

    • 修改状态

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

    实际上:

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

    确切的决定:

    个人资料 您的应用程序/代码,使用 使用代表性数据集 ,然后才能获得正确的图片和比较。

答案 2 :(得分:1)

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