或者重新提出问题:使用无符号值是否存在性能损失?
一般来说:IPhone ARM处理器上最高性能(16位签名?,32位签名?等)是什么?
C99标准允许您回答您的一般问题; 目标系统上最快的类型,高于特定的所需宽度,定义在stdint.h
.想象一下,我至少需要一个8位宽的整数:
#include#include int main (int argc, char **argv) { uint_fast8_t i; printf("Width of uint_fast8_t is %d\n", sizeof(i)); return 0; }
关于有符号或无符号的使用,除了性能之外还有其他要求,例如您是否确实需要使用无符号类型或者在溢出的情况下要执行的操作.鉴于我对自己的代码的了解,我愿意打赌除了选择原始整数类型之外,你的代码中还有其他减速;-).
它总是取决于:
对于循环有符号整数作为计数器和限制有点快,因为在C中编译器可以自由地假设溢出永远不会发生.
考虑一下:你有一个带有无符号循环计数器的循环,如下所示:
void function (unsigned int first, unsigned int last) { unsigned int i; for (i=first; i!=last; i++) { // do something here... } }
在这个循环中,编译器必须确保循环甚至在第一个大于last时终止,因为我将在溢出时从UINT_MAX换行为0(仅举几个例子 - 还有其他情况).这消除了一些循环优化的机会.对于带符号的循环计数器,编译器假定不会发生环绕并可能生成更好的代码.
对于整数除法,无符号整数在ARM上要快一些.ARM没有硬件除法单元,因此除法在软件中完成,并且总是在无符号值上完成.您将为将有符号的除法转换为无符号除法所需的额外代码保存一些周期.
对于所有其他事情,如算术,逻辑,加载和写入内存,符号的选择不会有任何区别.
关于数据大小:正如Rune指出的那样,它们或多或少具有相同的速度,32位类型的速度最快.有时需要在处理后调整字节和字,因为它们驻留在32位寄存器中,而上(未使用)位需要符号或零扩展.
但是,ARM CPU具有相对较小的数据高速缓存,并且通常连接到相对较慢的内存.如果您能够通过选择较小的数据类型来更有效地利用缓存,则即使理论循环计数增加,代码也可以更快地执行.
你必须在这里试验.
ARM是一种32位架构,因此32位整数是最快的.但是,16位整数和8位整数仅略慢.签名与未签名无关紧要,除非在特殊情况下(如此处其他答案所述).因此,两个或更多32位操作将模拟64位整数,因此速度较慢.
对于浮点类型,在iPhone处理器(带有VFP硬件浮点的ARM11)中,32位浮点数比64位双倍更快.