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内存.  
 
那位朋友分析一下是什么原因呢? 

解决方案 »

  1.   

    有时候代码一的运行速度快,有时候代码二的运行速度快WIN下本来就是多任务的,有时内存中处理的程序多,那运行速度就会慢,一两次的测试看不出问题的。
      

  2.   

    按理来说代二要比代码一要慢,因为代码二多了一条赋值语句,内存中多了一个赋值单元,增加了不必要的运行结果。如果代码一要慢,就要看看其他进程占用CPU的情况了。
      

  3.   

    看看你的编译优化开关是否打开?project->Options->Compile 左上角
      

  4.   

    同意Manwill71(天皇地虎江山一片) 。
    只有把赋值语句提出循环才能起到优化的作用吧。
    因为你的赋值仍然在循环里面,反而多了一次赋值操作,所以更慢。
      

  5.   

    还有就是imid=20,所以数组下标不是变化的,应该注意这点,如果数组下标变化,编译的结果也可能不一样的,速度也会不一样的。
      

  6.   

    对内存操作比对CPU操作要慢!第二种算法是慢。不过系统的进程优先级不同。和资源也不同。所以不是绝对的。
      

  7.   

    如果你想非要试试的话!就用DOS吧,然后用PASCAL!不就行了
      

  8.   

    编译优化开关是打开的.2种代码代码我分别运行了20多次(机器上没有运行其他程序),大多数情况下代码二运行的时间少于代码一,代码一比代码二速度快出现的几率程无规则状态。因此觉得比较奇怪。代码二
     用了a_state  :=  aNum[imid]<=itest  (实际运用imid值是随 i 变化的)
      这样就一次数值大小比较转换成了一次布尔值比较,不应该速度更快吗?
      

  9.   

    1、下标imid在你的例子中是不变的,所以delphi在编译后可能就自动优化了,所以跟实际情况中下标是变化的情况不符。delphi对这2种情况的编译结果可能不同,我不能确定,但是很有可能。
    2、一次数值大小比较转换成了一次布尔值比较,但是多了一次内存赋值,而且在进行内存赋值的时候还进行了一次布尔值比较,所以说,实际上是多了一次内存赋值。但是在其他地方(if  a_state=false  then  icount:=icount+1 )是少了一次数值比较,所以无法人为判断。这方面我不是很熟悉,只是发表一下看法。