gcc 編譯器與 clang 編譯器

黃志斌發表於2016-11-27

今天上午,盧濤在圖靈社群發表了一篇文章:尤拉計劃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

相關文章