原文出自ZZP的ABAP博客: http://hi.baidu.com/zzp0805/item/a5ff2a3a75d345cd382ffa1a
大家都知道,现在cpu识别的是指令
暂且不要考虑循环前置或者循环指令后置
但是高级语言都要转换成汇编语言来执行
指令现在在cpu都是分段执行的,分多少段要看具体的设计了
现在一个假设,假如一个高级语言是
a = 5;
b = 6;
c = 7;
转换成汇编之后会是
mov ax,5
mov bx,6
mov cx,7的指令
分段的话,先这样考虑指令分成:
读指令,执行指令
上面的指令,转化一下,可以变成这样:
原理是,第一条指令还没执行完,第二条就开始了,这些也就实现了众多指令同步,实现了流水线。
那么,我们就可以想想,如果有一个语句是:
如果有一个内表有50个数字,然后loop at 内表,某一字段的值:
loop at 内表.
if 变量 > 50
a = 5,b = 6,c = 7;
else
a = 6,b = 7,c = 8;
endloop.
那么会执行if指令,然后去判断,判断的时候,
赋值语句:a已经开始了,b也应该执行指令了,c也刚开始进入
但是,如果if一旦不成立,要执行else的话,
那if下面的3条语句就跑了,而且,流水线,会断了,会重新去执行else
然后重新去执行else的另外赋值
这个也就是我说了要少引起断流,
要先看看内表的值的大概分布,假如有1000条数据,其中比50大的有800条,比50小的有200条,那么用:
if 变量 > 50
a = 5,b = 6,c = 7;
else
a = 6,b = 7,c = 8;
就会产生200条断流
假如有1000条数据,其中比50小的有800条,比50大的有200条,那么用:
if 变量 > 50
a = 5,b = 6,c = 7;
else
a = 6,b = 7,c = 8;
就会产生800条断流
那就要改成另一种写法,速度会快一点:
if 变量 < 50
a = 6,b = 7,c = 8;
else
a = 5,b = 6,c = 7;
这样就只有200条断流了。
嘿嘿,大家很多是搞应用层的,不需要对底层太熟悉,但是知道某些原理对编程方面是很有帮助的。
希望这个指令级别的优化,会对大家的编程有帮助。