var
a,b,c:longint;
代码:
for i:=0 to 3000000 do
if a>b then c=a 
环境:
d7,xp 
试验数据样本中a,b的值=0-1024试验内容:
1:
  直接执行循环用时用时t1;
2:
  a,b的值预处理*10000后,循环用时t2;
3:
  a,b值预处理 shl 13,循环用时为 t3结果:
t1=6s;
t2=9s;
t3=6s;同样都是32位变量,为什么结果差别这么大?
现在需要采用2中的方法,编译器有什么选项吗?

解决方案 »

  1.   

    longint应该是不使用寄存器,所以会慢些。
      

  2.   

    你的测试代码有这样几个问题:
    1 3000000次太少,要测试这种只有几个时钟周期的代码的执行时间不够。加两个0看看执行的时间。
    2 最后有没有调用c的值?如果没有调用C的值,那么循环内的代码很可能被优化而无法得出正确的时间。
    3 a、b的初始值如何?不同条件分支的执行情况也可能影响执行时间。
      

  3.   

    谢谢楼上二位.
    大家认为三种情况的时间会相等么?
    其实不相等无关紧要,t2,t3的速度应当是相近的,为什么t3和t1接近呢?所以这里奢望将t2的速度提高到接近t3的水平
    请大家发表意见
      

  4.   

    不用寄存器是胡扯,cpu操作两个数的时候至少有一个数字需要在寄存器内
    整数乘法的速度比shl慢多了很正常,本身mul/imul的lantency、throughput就比shl/shr慢(位运算是cpu最基本的运算),再加上乘法运算还要多占用一个寄存器
      

  5.   

    从表面看
    只有和仅有高16位,或者低16位有数据时,大小比较的速度快,
    高低16位都有数据时速度就慢了
    比如:
    $000x000x 比较 0000xx00
     
    $0000xxxx 比较 xxxx0000
    $0000xxxx 比较 0000xxxx 
    耗时不一样,第一个没有后二个快,为什么?
      

  6.   

    你就别瞎测了,导致表面上结果不一至的因素很多,比如cpu cache的命中率,有条件分支还会引起流水线的中断
    32位寄存器是统一一个运算单元,一次比较32位,不会存在先判断高低16位就的可能