aNum: array of Longword;
bNum: array of Longword;
itest : Longword
代码一:
itest:=31231232;
imid:=20;
for i:=0 to 100000000 do
begin
if ((aNum[imid]<=itest) and (bNum[imid] >= itest)) then
icount:=icount+1
else
if (aNum[imid]>itest) then
icount:=icount+1
else
icount:=icount+1;
end;
代码二:
itest:=31231232;
imid:=20;
for i:=0 to 100000000 do
begin
a_state := aNum[imid]<=itest ;
if (a_state and (bNum[imid]>=itest)) then
icount:=icount+1
else
if a_state=false then
icount:=icount+1
else
icount:=icount+1;
end;
按说应该代码二的性能要比代码一的性能好。
但是非常奇怪,有时候代码一的运行速度快,有时候代码二的运行速度快。
我用的是毒龙的机器,128m内存.
那位朋友分析一下是什么原因呢?
bNum: array of Longword;
itest : Longword
代码一:
itest:=31231232;
imid:=20;
for i:=0 to 100000000 do
begin
if ((aNum[imid]<=itest) and (bNum[imid] >= itest)) then
icount:=icount+1
else
if (aNum[imid]>itest) then
icount:=icount+1
else
icount:=icount+1;
end;
代码二:
itest:=31231232;
imid:=20;
for i:=0 to 100000000 do
begin
a_state := aNum[imid]<=itest ;
if (a_state and (bNum[imid]>=itest)) then
icount:=icount+1
else
if a_state=false then
icount:=icount+1
else
icount:=icount+1;
end;
按说应该代码二的性能要比代码一的性能好。
但是非常奇怪,有时候代码一的运行速度快,有时候代码二的运行速度快。
我用的是毒龙的机器,128m内存.
那位朋友分析一下是什么原因呢?
只有把赋值语句提出循环才能起到优化的作用吧。
因为你的赋值仍然在循环里面,反而多了一次赋值操作,所以更慢。
用了a_state := aNum[imid]<=itest (实际运用imid值是随 i 变化的)
这样就一次数值大小比较转换成了一次布尔值比较,不应该速度更快吗?
2、一次数值大小比较转换成了一次布尔值比较,但是多了一次内存赋值,而且在进行内存赋值的时候还进行了一次布尔值比较,所以说,实际上是多了一次内存赋值。但是在其他地方(if a_state=false then icount:=icount+1 )是少了一次数值比较,所以无法人为判断。这方面我不是很熟悉,只是发表一下看法。