今天上午,卢涛在图灵社区发表了一篇文章:欧拉计划30题(加强版)。我把他的第二个程序稍做修改:

 1: #include <stdio.h>
 2: 
 3: static int a[1000], size;
 4: 
 5: int sum(int n)
 6: {
 7:   int z = 0;
 8:   for (; n > 0; n /= 10) {
 9:     int i = n % 10;
10:     z += i*i*i*i*i*i*i*i*i;
11:   }
12:   return z;
13: }
14: 
15: int sum2(int n)
16: {
17:   static int t = 0;
18:   int m = n % size;
19:   return (m != 0) ? (t + a[m]) : (t = sum(n));
20: }
21: 
22: int main()
23: {
24:   printf("Start\n"); fflush(stdout);
25:   size = sizeof(a) / sizeof(a[0]); int z = 0;
26:   for(int i = 1; i < size; i++) a[i] = sum(i);
27:   for(int i = 2; i <= (int)1e9; i++) {
28:     if (sum2(i) != i) continue;
29:     printf("%d\n", i); fflush(stdout);
30:     z += i;
31:   }
32:   printf("[%d]\n", z); fflush(stdout);
33:   return 0;
34: }

然后,分别使用 gcc 和 clang 编译,运行结果如下:

为什么 gcc 编译器编译出来的程序比 clang 慢这么多?这两个编译器的版本:

Euler$ gcc --version
gcc (GCC) 6.2.1 20160830
Copyright © 2016 Free Software Foundation, Inc.
本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
包括没有适销性和某一专用目的下的适用性担保。
Euler$
Euler$ clang --version
clang version 3.9.0 (tags/RELEASE_390/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin