• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    5年前 (2013-06-03)  系统原理 |   1 条评论  12 
    文章评分 0 次,平均分 0.0

    就if语句来说,从表面上看来,if语句使程序中出现了一个不确定的分叉点,CPU每次执行到if语句似乎都要判断一下if条件条件的真假才能继续向下执行,这样会耽误一些时间。如果if出现在了一个循环体当中,情况似乎会更加糟糕,尤其是当这个循环体需要无数次执行的时候。
    情况真的是这样吗?
    答案是否定的。任何一种高级编程语言在编译if语句时,都不可避免要编译出一条跳转指令,对于现代的CPU来说,指令是放在流水线上执行的,流水线上每时每刻都有多条指令在运转,但是并不会因为出现了跳转指令,CPU的流水线就要等待前面的指令执行完以便能够判断是否要跳转而导致流水线的停滞或者说出现一些空挡。一般说来,CPU都有“分支预测”机制,也许当CPU第一次遇到一个分支会真的停下来等待,但从第二次开始就绝对不会了,它会预言分支条件的真假还是像上次那样,从而执行与上次遇到这个分支时同样的指令路线。事实上,高级编程语言中的实际情况的确是这样,例如一个循环体if语句的分支条件只会有很少次数的变化,也许只要这个条件为真或假就跳出循环。CPU一旦预言失败,那么已经送上流水线的指令就全部无效了,因为事实上他们不应被执行。Intel的CPU会在预言两次失败后改变预言。
    某些开发者因为担心if语句会使系统每次都判断分支条件而将体性能,所以他们想方设法把if条件移出循环体,比较典型的方法就是把循环体写两遍或者多遍,而且这种方法并不总能奏效,有时会造成其他问题甚至错误。
    但现在知道了CPU的“分支预言”机制之后就不会有这种担心了,移动if的位置只会增加工作量并且使自己的代码水分增加。
    综上所述,请在可以容忍的范围内,尽情挥洒if语句的魅力,让if语句来得更猛烈些吧!

     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/1349.html

    关于

    发表评论

    暂无评论

    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享