|
本帖最后由 largewc 于 2013-3-17 14:24 编辑
huangpobu 发表于 2013-3-17 14:03
很同意性能没有过剩。我刚刚在Mathematica上跑一个最短路径算法都卡的半死,内存都爆了。
另外我介绍一 ...
应该不会,x86指令短跟简单指令完全没关系。
具体说一下吧,比如说arm
ldr r0,r3,0xXX,无论这个xx是多少,这个指令都是32bit。如果xx超过一个长度,也可能会被变成两条或者三条到四条指令,之前我说过,不用thumb-2,mov 32bit最长需要三条指令。所以这个指令总长度在32bit-128bit之间。
对于x86,mov,[ebp+xx],跟据xx的长度不同,这个指令可能是两个字节,可能是三个字节,可能是四个字皆,可能是6个字节,也就是16bit-48bit之间。
比如更多的add eax,[ebp+xx],用x86则更短,单条指令16-48bit就ok了,arm需要增加额外的32bit
上面那个例子,编译器在x86上一定结果是add eax,[ebp+xx],而不是mov ebx,[ebp+xx],add eax,abx这种类似arm代码框架的结果的。
x86指令短是肯定的,因为动长指令和更丰富的指令集,如果x86也改用简单指令,其实编译结果会变长的,而不是变短。
浮点为啥x86长,是因为x86的浮点是不能操作寄存器的,只能通过图灵机的压栈出栈操作,这玩意很浪费指令长度,不过考虑到浮点的运算周期很长,所以压栈退栈对于性能的影响并不高,所以没有整数那么敏感。
具体就是x86的浮点没有 mul aaa,bbb这种操作,而是 push bbb; push aaa; mul;这种,而浮点也不能压缩,肯定至少要浪费4字节,所以动长没有意义,最后指令比arm更长是很有可能的。
|
|