【发布时间】:2016-04-10 16:03:26
【问题描述】:
max_rem 函数计算(a+1)^n + (a-1)^n 除以a² 得到的n = 1, 2, 3... 的最大余数。 main 在从 3 到 999 的每个 a 上调用 max_rem。完整代码:
#include <inttypes.h>
#include <stdio.h>
int max_rem(int a) {
int max_r = 0;
int m = a * a; // <-------- offending line
int r1 = a+1, r2 = a-1;
for(int n = 1; n <= a*a; n++) {
r1 = (r1 * (a + 1)) % m;
r2 = (r2 * (a - 1)) % m;
int r = (r1 + r2) % m;
if(max_r < r)
max_r = r;
}
return max_r;
}
int main() {
int64_t sum = 0;
for(int a = 3; a < 1000; a++)
sum += max_rem(a);
printf("%ld\n", sum);
}
如果我将第 6 行更改为:
int m = a * a;
到
int64_t m = a * a;
整个计算速度变慢了大约 150%。我尝试了gcc 5.3 和clang 3.6。
与int:
$ gcc -std=c99 -O3 -Wall -o 120 120.c
$ time(./120)
real 0m3.823s
user 0m3.816s
sys 0m0.000s
int64_t:
$ time(./120)
real 0m9.861s
user 0m9.836s
sys 0m0.000s
是的,我使用的是 64 位系统。为什么会这样?
我一直认为使用 int64_t 更安全、更便携,并且是“编写 C 的现代方式”®,并且不会损害 64 位系统上数字代码的性能。这个假设是错误的吗?
编辑:明确一点:即使您将 every 变量更改为 int64_t,减速仍然存在。所以这不是混合int和int64_t的问题。
【问题讨论】:
-
尝试将所有整数更改为 (u)int64_ts。
-
您将
int64_t与int混合在一起。在整个函数中使用相同的类型。 -
如果他已经在使用 64 位,那又有什么关系呢?归根结底,不应该生成相同的程序集吗?我认为这是一个非常好的问题。
-
即使您将所有内容都更改为 int64_t,减速也是一样的。我编辑澄清。
-
你知道你可以做
time ./120,对吧?你不需要分叉(subshell)。
标签: c performance