bob.s
.data
variable:
.word 0,0,0,0
.word 0,0,0,0
.word 0,0,0,0
.word 0,0,0,0
.word 0,0,0,0
.word 0,0,0,0
.text
.globl runAssemblyCode
runAssemblyCode:
mov $0xFFFFFFFF,%eax
start_loop:
decl variable+0
decl variable+8
decl variable+16
dec %eax
jne start_loop
retq
ted.c
#include <stdio.h>
#include <time.h>
void runAssemblyCode ( void );
int main ( void )
{
volatile unsigned int ra,rb;
ra=(unsigned int)time(NULL);
runAssemblyCode();
rb=(unsigned int)time(NULL);
printf("%u\n",rb-ra);
return(0);
}
gcc -O2 ted.c bob.s -o ted
这是使用额外指令的结果:
00000000004005d4 <runAssemblyCode>:
4005d4: b8 ff ff ff ff mov $0xffffffff,%eax
00000000004005d9 <start_loop>:
4005d9: ff 0c 25 28 10 60 00 decl 0x601028
4005e0: ff 0c 25 30 10 60 00 decl 0x601030
4005e7: ff 0c 25 38 10 60 00 decl 0x601038
4005ee: ff 0c 25 40 10 60 00 decl 0x601040
4005f5: ff c8 dec %eax
4005f7: 75 e0 jne 4005d9 <start_loop>
4005f9: c3 retq
4005fa: 90 nop
我看不出有什么区别,也许你可以纠正我的代码或者其他人可以在他们的系统上尝试看看他们看到了什么...
如果你正在做除字节为基础的内存递减之外的其他事情,那么这是一条极其痛苦的指令,而且如果不对缓存行以及核心数量等进行敏感处理,那么它将对内存系统造成痛苦。所以这个例程应该对缓存行以及核心数量等进行敏感处理。
无论是否有额外的指令,都需要大约13秒钟。
AMD Phenom 9950四核处理器
在
Intel(R) Core(TM)2 CPU 6300
无论是否有额外的指令,都需要大约9-10秒钟。
双处理器:
Intel(R) Xeon(TM) CPU
无论是否有额外的指令,都需要大约13秒钟。
在这个上面:
Intel(R) Core(TM)2 Duo CPU T7500
无论是否有额外的指令,都需要8秒钟。
所有机器都运行Ubuntu 64位10.04或10.10,可能还有11.04。
更多的机器,64位,ubuntu
Intel(R) Xeon(R) CPU X5450 (8核)
无论是否有额外的指令,都需要大约6秒钟。
Intel(R) Xeon(R) CPU E5405(8核)
有或没有都是9秒。
您的系统中DDR/DRAM的速度是多少?运行的处理器类型是什么(如果在Linux上,请使用cat /proc/cpuinfo命令)。
Intel(R) Xeon(R) CPU E5440(8核)
有或没有都是6秒。
啊,找到了一个单核心的,不过是Xeon:
Intel(R) Xeon(TM) CPU
有或没有额外指令都是15秒。