Delphi Is case variant";N..N+;100“;高效的cpu代码?
我有这样的Delphi案例代码Delphi Is case variant";N..N+;100“;高效的cpu代码?,delphi,Delphi,我有这样的Delphi案例代码 const delta=100; case N of 1: begin end; 2: begin end; 1000..1000+delta: begin {useful code} end; 8000: begin {useful code} end; end; 它是否有效(代码对N=8000运行速度快),对大的delta=100运行速度快,对delta=300或delta
const delta=100;
case N of
1: begin end;
2: begin end;
1000..1000+delta: begin {useful code} end;
8000: begin {useful code} end;
end;
它是否有效(代码对
N=8000
运行速度快),对大的delta=100
运行速度快,对delta=300
或delta=2000
运行速度快?或者,对于较大的增量,代码速度较慢?编译器将此代码分支转换为类似于的指令
if (N>=1000) and (N<=1100) then
生成带有我的注释的代码
Unit1.pas.163: case N of
006761BD 8B45F8 mov eax,[ebp-$08]
006761C0 48 dec eax
006761C1 2DE7030000 sub eax,$000003e7 //if N <=999
006761C6 7207 jb $006761cf //goto 'small'
006761C8 83E865 sub eax,$65 //else if N <=1100
006761CB 7211 jb $006761de //goto 'OK'
006761CD EB1E jmp $006761ed //else goto 'big'
Unit1.pas.163:案例N
006761BD 8B45F8 mov eax,[ebp-$08]
006761C0 48年12月eax
006761C1 2DE7030000子eax,$000003e7//if N编译器将此代码分支转换为类似于
if (N>=1000) and (N<=1100) then
生成带有我的注释的代码
Unit1.pas.163: case N of
006761BD 8B45F8 mov eax,[ebp-$08]
006761C0 48 dec eax
006761C1 2DE7030000 sub eax,$000003e7 //if N <=999
006761C6 7207 jb $006761cf //goto 'small'
006761C8 83E865 sub eax,$65 //else if N <=1100
006761CB 7211 jb $006761de //goto 'OK'
006761CD EB1E jmp $006761ed //else goto 'big'
Unit1.pas.163:案例N
006761BD 8B45F8 mov eax,[ebp-$08]
006761C0 48年12月eax
006761C1 2DE7030000子eax,$000003e7//如果N是一个常量表达式。它是一个常量表达式。只有当您现在了解N的不同值出现的频率时,你能把最常出现的案例放在第一位来进行优化吗?你是说如果案例在源代码@Jan中以不同的顺序出现,编译器会生成不同的代码吗?我对此表示怀疑。@rob是的,我假设(基于可能的旧信息)case A B C将导致if语句的顺序与case C B A不同。毕竟,编译器没有理由将一个case值高于另一个case,它是一个确定性机器-它不会随机化它们。当然,它不会随机化它们,@Jan,但对它们进行排序,让案例检查代码只检查每个边界条件一次也是有意义的。只有当你现在知道N的不同值出现的频率时,你能把最常出现的案例放在第一位来进行优化吗?你是说如果案例在源代码@Jan中以不同的顺序出现,编译器会生成不同的代码吗?我对此表示怀疑。@rob是的,我假设(基于可能的旧信息)case A B C将导致if语句的顺序与case C B A不同。毕竟,编译器没有理由将一个case值高于另一个case,它是一个确定性机器-它不会随机化它们。当然,它不会随机化它们,@Jan,但是,对它们进行排序,让案例检查代码只检查每个边界条件一次也是有意义的。