什么是代码分支?我已经在不同的地方看到过这种情况,特别是有点蠢蠢欲动,但从未真正考虑过它?
如何降低程序速度,以及编码时我应该考虑什么?
我看到if
语句的提及。我真的不明白这些代码如何减慢代码速度。如果条件为真,请按照说明操作,否则跳转到另一组指令?我看到另一个提到“分支预测”的帖子,也许这就是我真正迷失的地方。有什么可以预测的?条件就在那里,它只能是真或假。
我不认为这是this related question的副本。链接的线程正在讨论关于未排序数组的“分支预测”。我在问什么是分支以及为什么需要预测。
答案 0 :(得分:11)
分支的最简单示例是if语句:
if (condition)
doSomething();
如果condition
为true
,则执行doSomething()
。如果没有,那么执行分支,跳转到if
结束后的语句。
在非常简单的机器伪代码中,这可能会被编译为以下行:
TEST condition
JZ label1 ; jump over the CALL if condition is 0
CALL doSomething
@@label1
分支点是JZ
指令。后续执行点取决于condition
的测试结果。
分支会影响性能,因为现代处理器会提前预测分支的结果并执行推测性执行。如果预测结果是错误的,则必须解开推测性执行。
如果您可以安排代码以使预测成功率更高,那么性能会提高。这是因为推测性执行的代码现在减少了开销,因为它甚至在需要之前就已经执行了。这是可能的,因为现代处理器是高度并行的。可以使用备用执行单元执行此推测执行。
现在,有一种代码永远不会有分支预测错过。那就是没有分支的代码。对于无分支代码,推测执行的结果总是有用的。因此,在所有其他条件相同的情况下,没有分支的代码比具有分支的代码执行得更快。
答案 1 :(得分:7)
基本上想象一下工厂中的装配线。想象一下,当每个项目通过装配线时,它将转到员工1,然后是员工2,最多转移到员工5.员工5完成后,该项目已完成并准备好打包。因此,所有五名员工可以同时处理不同的项目,而不必只是在彼此等待。与大多数装配线不同,每次员工1开始处理新项目时,它可能是一种新类型的项目 - 而不是一遍又一遍的相同类型。
嗯,无论出于什么奇怪和富有想象力的原因,想象一下经理站在装配线的最后。他有一个清单说:“首先制作这个项目。然后制作那种类型的物品。然后是那种类型的物品。”等等。当他看到员工5完成每个项目并继续下一个项目时,经理然后告诉员工1哪个项目类型开始工作,看看他们当时在列表中的位置。
现在让我们说这个清单中有一点 - “计算机指令序列” - 它说:“现在开始制作一个咖啡杯。如果是你完成制作杯子的夜晚,那么就开始做一顿冷冻晚餐。如果是白天,那就开始制作一袋咖啡渣。“这是你的if语句。由于经理,在这种虚假的例子中,他真的不知道一天中的什么时间,直到他在杯子结束后真正看到杯子,他可以等到那个时候召唤下一个项目 - 冷冻晚餐或咖啡渣。
问题在于,如果等到最后一秒钟那样 - 他必须等到绝对确定一天什么时候才能完成杯子,这样下一个项目会怎样是 - 然后工人1-4在工人5完成之前根本不会做任何工作。这完全违背了流水线的目的!所以经理猜测。工厂一天开放7小时,晚上只开放1小时。所以杯子很可能在白天完成,因此保证了咖啡渣。
一旦员工2开始在咖啡杯上工作,经理就会向员工拨打咖啡场1.然后装配线就像以前一样继续前进,直到员工5完成杯子。那时经理终于看到了一天中的什么时间。如果是白天,那真是太棒了!如果是夜晚,一切都在咖啡杯被丢弃之后开始,必须开始冷冻晚餐。 ......因此,分支预测实际上就是经理暂时冒这样的猜测,当他正确的时候,这条线会更快地移动。
伪编辑:
它主要与硬件有关。主要的搜索短语可能是“计算机管道cpu”。但是指令列表已经完成了 - 只是指令列表中有分支;它并不总是1,2,3等。但是当管道的第5阶段正在完成指令10时,第1阶段已经可以处理指令14.通常计算机指令可以像这样分解并分段处理。如果阶段1-n同时处理某些事情,并且之后没有任何事情被破坏,那么在开始另一阶段之前,这比完成一阶段更快。
答案 2 :(得分:0)
代码中的任何跳转都是分支。这发生在if
语句函数调用和循环中。
现代CPU有长管道。这意味着CPU同时处理多个指令的各个部分。分支的问题是管道可能尚未开始处理正确的指令。这意味着需要抛出推测指令,处理器需要从头开始处理指令。
遇到分支时,CPU会尝试预测将使用哪个分支。这称为分支预测。
分支预测的大多数优化都将由编译器完成,因此您不必担心分支。
如果您已经分析了代码并且可以看到这是一个问题,那么这可能属于仅担心分支优化的类别。
答案 3 :(得分:0)
分支是偏离正常控制流程。处理器将按顺序执行指令,但在分支中,程序计数器被移动到内存中的另一个位置(例如,根据条件或过程调用的分支)。