在“计算机体系结构”一书中,Tanenbaum 有以下几行:
...制造商开始相互竞争,试图发布最好的程序。这些命令没有什么价值,因为使用现有程序可以轻松解决相同的任务,但它们通常工作得更快一些。例如,许多计算机使用 INC (INCrement) 指令,该指令将数字加一。然后就已经有了通用的加法命令ADD,不需要再引入新的加一的命令了。但是,INC 命令比 ADD 命令稍快,因此它也包含在命令集中。
如果有人能解释为什么 INC 命令比 ADD 命令快,将不胜感激。
在“计算机体系结构”一书中,Tanenbaum 有以下几行:
...制造商开始相互竞争,试图发布最好的程序。这些命令没有什么价值,因为使用现有程序可以轻松解决相同的任务,但它们通常工作得更快一些。例如,许多计算机使用 INC (INCrement) 指令,该指令将数字加一。然后就已经有了通用的加法命令ADD,不需要再引入新的加一的命令了。但是,INC 命令比 ADD 命令稍快,因此它也包含在命令集中。
如果有人能解释为什么 INC 命令比 ADD 命令快,将不胜感激。
没有什么比这更容易了。INC 指令比 ADD 指令快,因为(至少)第二个操作数没有在 INC 指令中指定,即第二项没有在 INC 指令中指定。因为在 INC 命令中,第二项总是等于 1。而在 ADD 命令中,您必须明确指定第二项。因此(至少)从 INC 指令存储器中获取(读取)比从 ADD 指令存储器中获取(读取)更快。由于在 INC 指令中没有必要从内存中选择(读取)第二个操作数。这两条指令执行时间的差异取决于寻址的类型,但这种差异绝不会小于从内存中读取一次,即(至少)INC 指令的速度是 ADD 指令的两倍。
UPD1:
嗯,就是从指令内存中取(读)取(读)指令,INC指令的速度是ADD指令的两倍。并且还有实际执行时间,但它通常小于内存获取。即使提取来自一级缓存,即以处理器的频率,这也是总命令执行时间的重要部分。所以 INC 命令比 ADD 命令快 30%。顺便说一下,萝卜7000+的程序员可以自己摸索。需要将 INC 指令循环数百万个周期,然后将 ADD 指令循环数百万个周期。然后看看第一种情况和第二种情况都经过了多少时间。这种差异很大程度上取决于处理器,但我认为在最酷的英特尔宝石上,它不低于相同的 30%。在更简单的石头上,这种差异会更大。无法测量任何东西 并查看处理器的文档。处理器制造商总是为所有指令和所有寻址模式编译一个运行时表,并将此表发布给优化器编译器制造商。好吧,对于普通程序员来说,这也是有用的信息。
UPD2:
我在闲暇时想了想。事实证明,寻址越复杂,与 ADD 相比,INC 的执行时间增益就越小。如果寻址是间接索引,并且每次内存取指需要 1 个时钟,而实际执行需要 1 个时钟,那么 INC 将有 4 个时钟的运行时间,而 ADD 将有 5 个时钟的运行时间。也就是说,差异不会是 30%,而只有 20%。