【问题标题】:Is immediate addressing faster than a register access?立即寻址比寄存器访问快吗?
【发布时间】:2017-06-23 19:42:34
【问题描述】:

例如,假设您有一个变量c,由于 CPU 的优化,您可以放心地假设它存储在寄存器中。以下哪个更快?

c = getchar();
if( c == 033 ){
    putchar( 033 );
    …
}

c = getchar();
if( c == 033 ){
    putchar( c );
    …
}

我猜第一个会更快,因为它使用立即寻址而不是寄存器访问。我的假设正确吗?

【问题讨论】:

  • 您应该假设编译器将为两者生成相同的代码,使用立即寻址或寄存器寻址中的任何一个更快。你不应该担心它。在这种情况下,我会写putchar(c),因为我认为这样的代码总体上更具可读性,但理性的人可能会不同意。如果您不使用八进制并且没有在括号内放置空格,它也会更具可读性。
  • 看反汇编。我真的不在乎差异。
  • 我会启动一个精密基准测试器并对其进行测试。
  • 微优化产生微改进。
  • 考虑到调用 putchar 所消耗的数千个(数百万个?)时钟周期,两者之间的任何差异都可以忽略不计。始终专注于首先编写清晰易懂的代码,并且仅在速度出现问题时才进行优化。然后,不要浪费时间在这些微小的收益上,看看你的算法,看看它们是否可以改进。

标签: c assembly addressing-mode


【解决方案1】:

这不会有太大影响,因为这只是一个 sn-p。相反,我会说当我们编写 putchar(c) 时它会更好地工作,因为这是编译器经过训练可以理解更多的内容。

【讨论】:

    【解决方案2】:

    这在很大程度上取决于指令集和立即数与寄存器,由于您需要立即数或负载才能将其放入寄存器,因此寄存器可能会稍微慢一两个时钟。除非指令集是可变长度的,否则它在指令中的立即数也可能会花费您的指令周期。

    无论如何,putchar 都会淹没这个,数百到数千个时钟周期,而您试图在此处保存的一两个时钟周期。

    一些指令集对立即数有限制。所以这非常依赖于指令集,然后依赖于应用程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-05
      • 2012-05-11
      • 2019-03-12
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      相关资源
      最近更新 更多