TripleX
TripleX 当前离线 UID12028 帖子6 精华0 积分6 阅读权限10 在线时间0 小时 注册时间2008-7-14 最后登录2008-7-18
![]()
列兵
![]() | 55#
发表于 2008-7-15 23:18 | 只看该作者
一时好奇下了benchmark代码来看 觉得简直就是针对x86下套阿
那个代码我在xscale上跑 每个时钟的性能比同频的PentiumM都好 显然是瞎搞
看看代码的内容 这是其中一个测试
int do_1e6CHAR_AM()
{
char b=3;
char a1,a2,a3,a4,a5,a6,a7,a8;
a1=a2=a3=a4=a5=a6=a7=a8=b;
register int i;
for(i=0;i<125000;i++)
{
a1+=(b+i%3+1);
a2+=(b+i%3+1);
a3+=(b+i%3+1);
a4+=(b+i%3+1);
a5+=(b+i%3+1);
a6+=(b+i%3+1);
a7+=(b+i%3+1);
a8+=(b+i%3+1);
a1-=(i%3+1);
a2-=(i%3+1);
a3-=(i%3+1);
a4-=(i%3+1);
a5-=(i%3+1);
a6-=(i%3+1);
a7-=(i%3+1);
a8-=(i%3+1);
b=i%3;
}
return (a1+a2+a3+a4+a5+a6+a7+a8);
}
这简直就是针对x86下套嘛 不多不少正好定义8个局部变量 对arm mips这样寄存器多的架
构
正好可以完全在寄存器里跑 而对x86 有五个变量得使用内存操作指令 因为寄存器没这么
多
而且这个测试对寄存器比较多的risc芯片完全不涉及除了寄存器运算之外的测试 不知道有
什么意义
对x86 虽然内存操作最后一定会在cache里命中 但是也比寄存器操作慢了很多
对x86 使用-fomit-frame-pointer可以大幅提高性能 因为节省了一个寄存器
这样只有四个变量需要内存指令 但是他们在测试的时候并没有加上这个编译参数
如果把变量数量提升到64个 我估计龙芯会完败 :-)
贴一下编译器生成的汇编指令
x86 没有-fomit-frame-pointer的指令序列
addl %eax, %edi
addb %al, %bl
addl %eax, %esi
addb %al, -17(%ebp)
addb %al, -16(%ebp)
addb %al, -15(%ebp)
addb %al, -14(%ebp)
addb %al, -13(%ebp)
x86 加-fomit-frame-pointer之后
addl %eax, %edi
addb %al, %bl
addl %eax, %esi
addl %eax, %ebp
addb %al, (%esp)
addb %al, 1(%esp)
addb %al, 2(%esp)
addb %al, 3(%esp)
xscale
add lr, r1, r0
add r3, fp, r0
add r2, r9, r0
add ip, sl, r0
add r7, r7, r0
add r4, r4, r0
add r5, r5, r0
add r6, r6, r0
手头没有龙芯 要不然看看生成的汇编代码一定很有意思 :-) |
|