The max_rem
函数计算最大余数(a+1)^n + (a-1)^n
除以时离开a²
for n = 1, 2, 3...
. The main
calls max_rem
在每一个a
from 3
to 999
。完整代码:
#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;
to
int64_t m = a * a;
整个计算变成了关于慢 150%。我都尝试过gcc 5.3
and clang 3.6
.
With int
:
$ gcc -std=c99 -O3 -Wall -o 120 120.c
$ time(./120)
real 0m3.823s
user 0m3.816s
sys 0m0.000s
with int64_t
:
$ time(./120)
real 0m9.861s
user 0m9.836s
sys 0m0.000s
是的,我正在64位系统。为什么会发生这种情况?
我一直假设使用int64_t
更安全、更便携,是“编写 C 的现代方式”®,并且不会损害 64 位系统上数字代码的性能。这个假设是错误的吗?
EDIT: 只是为了明确:即使你做出改变,减速仍然持续every变量为int64_t
。所以这不是混合的问题int
and int64_t
.
我一直认为使用 int64_t 更安全、更便携,是“编写 C 的现代方式”®,并且不会损害 64 位系统上数字代码的性能。这个假设是错误的吗?
对我来说似乎是这样。您可以在以下位置找到指令时间英特尔软件优化参考手册 http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf(附录 C,第 645 页表 C-17 通用说明):
IDIV r64 Throughput 85-100 cycles per instruction
IDIV r32 Throughput 20-26 cycles per instruction
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)