Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi Is case variant";N..N+;100“;高效的cpu代码?_Delphi - Fatal编程技术网

Delphi Is case variant";N..N+;100“;高效的cpu代码?

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

我有这样的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=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,但是,对它们进行排序,让案例检查代码只检查每个边界条件一次也是有意义的。