这个是不是要编译高人来回答?longint比较大小快慢让人费解, vara,b,c:longint;代码:for i:=0 to 3000000 doif 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中的方法,编译器有什么选项吗? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 longint应该是不使用寄存器,所以会慢些。 你的测试代码有这样几个问题:1 3000000次太少,要测试这种只有几个时钟周期的代码的执行时间不够。加两个0看看执行的时间。2 最后有没有调用c的值?如果没有调用C的值,那么循环内的代码很可能被优化而无法得出正确的时间。3 a、b的初始值如何?不同条件分支的执行情况也可能影响执行时间。 谢谢楼上二位.大家认为三种情况的时间会相等么?其实不相等无关紧要,t2,t3的速度应当是相近的,为什么t3和t1接近呢?所以这里奢望将t2的速度提高到接近t3的水平请大家发表意见 不用寄存器是胡扯,cpu操作两个数的时候至少有一个数字需要在寄存器内整数乘法的速度比shl慢多了很正常,本身mul/imul的lantency、throughput就比shl/shr慢(位运算是cpu最基本的运算),再加上乘法运算还要多占用一个寄存器 从表面看只有和仅有高16位,或者低16位有数据时,大小比较的速度快,高低16位都有数据时速度就慢了比如:$000x000x 比较 0000xx00 $0000xxxx 比较 xxxx0000$0000xxxx 比较 0000xxxx 耗时不一样,第一个没有后二个快,为什么? 你就别瞎测了,导致表面上结果不一至的因素很多,比如cpu cache的命中率,有条件分支还会引起流水线的中断32位寄存器是统一一个运算单元,一次比较32位,不会存在先判断高低16位就的可能 安装dephi 7.0后打开dephi程序提示:class tdxmemo not found 日期减日期的语句如何写 SOCKET与线程的问题? 如何替换字符串中的某一个字符 如何往串口发文件 又一个很菜的问题,IF语句的执行语句超过2句怎么办啊? 怎样取得本机的真实IP地址(不要只取出127.0.0.1)? 关于字段对象的问题求教!!!!! PrintDBGridEh页数参数是什么 急急急急急急急急,请各位高手指教! tstrings 菜鸟问题,dpr文件则呢编译,
1 3000000次太少,要测试这种只有几个时钟周期的代码的执行时间不够。加两个0看看执行的时间。
2 最后有没有调用c的值?如果没有调用C的值,那么循环内的代码很可能被优化而无法得出正确的时间。
3 a、b的初始值如何?不同条件分支的执行情况也可能影响执行时间。
大家认为三种情况的时间会相等么?
其实不相等无关紧要,t2,t3的速度应当是相近的,为什么t3和t1接近呢?所以这里奢望将t2的速度提高到接近t3的水平
请大家发表意见
整数乘法的速度比shl慢多了很正常,本身mul/imul的lantency、throughput就比shl/shr慢(位运算是cpu最基本的运算),再加上乘法运算还要多占用一个寄存器
只有和仅有高16位,或者低16位有数据时,大小比较的速度快,
高低16位都有数据时速度就慢了
比如:
$000x000x 比较 0000xx00
$0000xxxx 比较 xxxx0000
$0000xxxx 比较 0000xxxx
耗时不一样,第一个没有后二个快,为什么?
32位寄存器是统一一个运算单元,一次比较32位,不会存在先判断高低16位就的可能