为了账号安全,请及时绑定邮箱和手机立即绑定

“中频”贵吗?

“中频”贵吗?

德玛西亚99 2019-11-22 15:13:57
对于我的一生,我无法记住那天我们老师的确切讲话,我希望您可能会知道。该模块是“数据结构和算法”,他向我们介绍了以下内容:这if句话是最昂贵的。[某物]注册[某物]。是的,我的记忆确实很糟糕,真的很抱歉,但是我已经搜寻了好几个小时,没有任何反应。有任何想法吗?
查看完整描述

3 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

在最低级别(在硬件中),是的,如果 s昂贵。为了理解原因,您必须了解管道如何工作。


当前要执行的指令存储在通常称为指令指针(IP)或程序计数器(PC)的东西中。这些术语是同义词,但是不同的术语用于不同的体系结构。对于大多数指令,下一条指令的PC就是当前PC加上当前指令的长度。对于大多数RISC架构,指令都是固定长度的,因此PC可以递增恒定量。对于x86之类的CISC体系结构,指令可以是可变长度的,因此对指令进行解码的逻辑必须弄清楚当前指令要找到多长时间才能找到下一条指令的位置。


但是,对于分支指令,要执行的下一条指令不是当前指令之后的下一个位置。分支是指令-它们告诉处理器下一条指令在哪里。分支可以是有条件的,也可以是无条件的,目标位置可以是固定的或计算的。


有条件与无条件比较容易理解-只有在满足特定条件(例如,一个数字是否等于另一个数字)的情况下,才进行条件分支。如果不执行分支,则控制像往常一样前进到分支之后的下一条指令。对于无条件分支,总是采用分支。条件分支显示在if语句和forand while循环的控制测试中。无条件分支显示在无限循环,函数调用,函数返回break和continue语句,臭名昭著的goto语句等中(这些列表远非详尽)。


分支机构目标是另一个重要问题。大多数分支都有固定的分支目标-它们会转到编译时固定的代码中的特定位置。这包括if语句,各种循环,常规函数调用等等。 计算分支在运行时计算分支的目标。这包括switch语句(有时),从函数返回,虚拟函数调用和函数指针调用。


那么,这一切对性能意味着什么?当处理器看到分支指令出现在其管道中时,它需要弄清楚如何继续填充其管道。为了弄清楚程序流中的分支后面有什么指令,它需要知道两件事:(1)是否将采用分支;(2)分支的目标。弄清楚这一点称为分支预测,这是一个具有挑战性的问题。如果处理器猜对了,程序将以全速继续。相反,如果处理器猜测正确,它只是花了一些时间计算错误的事情。现在,它必须刷新其管道,并从正确的执行路径中重新加载指令。底线:表现出色。


因此,语句昂贵的原因是由于分支的错误预测。这仅处于最低级别。如果您正在编写高级代码,则完全不必担心这些细节。仅当您使用C或汇编语言编写对性能至关重要的代码时,才应考虑这一点。在这种情况下,即使需要更多指令,编写无分支代码通常也比分支代码更好。有一些很酷位变换花样,你可以做计算的东西,如abs(),min()和max()没有分支。


查看完整回答
反对 回复 2019-11-22
?
largeQ

TA贡献2039条经验 获得超7个赞

“昂贵”是一个非常相对的术语,尤其是与“ if”语句的关系,因为您还必须考虑条件的成本。范围从任何简短的cpu指令到测试调出远程数据库的函数的结果。

我不会担心。除非您正在执行嵌入式编程,否则您可能根本不必担心“ if” 的成本。对于大多数程序员而言,它永远不会成为您应用程序性能的驱动因素。


查看完整回答
反对 回复 2019-11-22
  • 3 回答
  • 0 关注
  • 386 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信