在C语言中,为什么
即使测试相同的数字,为什么我的代码的“unsigned”版本比“signed”版本慢?(我使用的是x86-64 Intel处理器)。 类似的链接: 编译命令:
signed int
比unsigned int
更快?虽然这个问题在本网站上已经被问答过多次(参见下面的链接),但是大多数人说它们之间没有差别。我写了代码,偶然发现了显著的性能差异。即使测试相同的数字,为什么我的代码的“unsigned”版本比“signed”版本慢?(我使用的是x86-64 Intel处理器)。 类似的链接: 编译命令:
gcc -Wall -Wextra -pedantic -O3 -Wl,-O3 -g0 -ggdb0 -s -fwhole-program -funroll-loops -pthread -pipe -ffunction-sections -fdata-sections -std=c11 -o ./test ./test.c && strip --strip-all --strip-unneeded --remove-section=.note --remove-section=.comment ./test
signed int
版本
注意:如果我明确声明所有数字为signed int
,则不会有任何区别。
int isprime(int num) {
// Test if a signed int is prime
int i;
if (num % 2 == 0 || num % 3 == 0)
return 0;
else if (num % 5 == 0 || num % 7 == 0)
return 0;
else {
for (i = 11; i < num; i += 2) {
if (num % i == 0) {
if (i != num)
return 0;
else
return 1;
}
}
}
return 1;
}
无符号整数
版本
int isunsignedprime(unsigned int num) {
// Test if an unsigned int is prime
unsigned int i;
if (num % (unsigned int)2 == (unsigned int)0 || num % (unsigned int)3 == (unsigned int)0)
return 0;
else if (num % (unsigned int)5 == (unsigned int)0 || num % (unsigned int)7 == (unsigned int)0)
return 0;
else {
for (i = (unsigned int)11; i < num; i += (unsigned int)2) {
if (num % i == (unsigned int)0) {
if (i != num)
return 0;
else
return 1;
}
}
}
return 1;
}
使用以下代码在文件中测试:
int main(void) {
printf("%d\n", isprime(294967291));
printf("%d\n", isprime(294367293));
printf("%d\n", isprime(294967293));
printf("%d\n", isprime(294967241)); // slow
printf("%d\n", isprime(294967251));
printf("%d\n", isprime(294965291));
printf("%d\n", isprime(294966291));
printf("%d\n", isprime(294963293));
printf("%d\n", isprime(294927293));
printf("%d\n", isprime(294961293));
printf("%d\n", isprime(294917293));
printf("%d\n", isprime(294167293));
printf("%d\n", isprime(294267293));
printf("%d\n", isprime(294367293)); // slow
printf("%d\n", isprime(294467293));
return 0;
}
结果(time ./test
):
Signed - real 0m0.949s
Unsigned - real 0m1.174s
idivl
与divl
)方面存在差异,但执行时间大致相同,跟OP所展示的情况一样。这种差异可能是由于这些指令引起的...是否由于指令并行性、乱序执行等原因导致的边界效应呢? - Jean-Baptiste Yunès(unsigned int)3
可以更清晰地写成3u
。 - M.M