2017-10-28 69 views
0

我在Win7和Linux Ubuntu 16上測試了一些簡單的基準測試計算,以比較計時和被懷疑,Win似乎比Linux快得多。Linux vs Windows性能

Win和Linux x64都支持同一臺機器,同樣的cpu時鐘設置。我使用VC2010,在Win上使用-O2(最大速度)優化,在Linux上使用-O3使用gcc5。 Win的結果爲2375ms,Linux的結果爲2800ms。 Linux甚至使用-Ofast優化。無論如何,gcc和g ++都給出了相同的結果。

我對此行爲的解釋是,VC和Win運行時對x86/64進行了極其優化。

有人可能會提出一個建議,爲什麼會發生這種情況?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <time.h> 
#include <math.h> 

#define Pk 41 
#define Lmz 101 
#define Mmz 101 
#define Nmz 101 

// input data 
float US[Pk][Lmz][Mmz][Nmz], VS[Pk][Lmz][Mmz][Nmz], HS[Pk][Lmz][Mmz][Nmz], QS[Pk][Lmz][Mmz][Nmz], TS[Pk][Lmz][Mmz][Nmz]; 
float F_X[Mmz][Nmz]; 
float Zmz[Nmz]; 

// output data 
float Q[Pk][Lmz][Mmz][Nmz]; 

void Init() { 
    int h, k, j, i; 

    for (h = 0; h < Pk; h++) 
     for (k = 0; k < Lmz; k++) 
      for (j = 0; j < Mmz; j++) 
       for (i = 0; i < Nmz; i++) { 
        US[h][k][j][i] = 1+sin((float)i*j+i-k-h); 
        VS[h][k][j][i] = 2+cos((float)3*i*h-j+h*k); 
        HS[h][k][j][i] = 3+sin((float)2*i*k+j*h); 
        QS[h][k][j][i] = 4+cos((float)i+j+k+h+10); 
        TS[h][k][j][i] = 5+sin((float)(j+i)*k-h); 
       } 

    for (j = 0; j < Mmz; j++) 
     for (i = 0; i < Nmz; i++) 
      F_X[j][i] = sin((float)i*j-i+123); 

    for (i = 0; i < Nmz; i++) 
     Zmz[i] = cos((float)2*i); 
} 

void Calc() { 
    int h, k, j, i; 
    float Rs = 0, a = 0, Tp = 0, Tv = 0; 
    for(h = 0; h < Pk; h++) 
    { 
     for(k = 0; k < Lmz; k++) 
     { 
      for(j = 0; j < Mmz; j++) 
      { 
       for(i = 0; i < Nmz; i++) 
       { 
        a = (1.23 + US[h][k][j][i]/0.321) * Rs * VS[h][k][j][i]; 
        Tp = TS[h][k][j][i] * pow(1000./HS[h][k][j][i], 2./7.); 
        Tv = Tp * (1. + 0.6078 * QS[h][k][j][i]); 
        Q[h][k][j][i] = a - (0.5 * Tv + (1. - Zmz[k]) * 9.8 * F_X[j][i]/0.321); 
       } 
      } 
     } 
    } 
} 

int main() { 
    int h, k, j, i; 
    clock_t timer; 

    Init(); 

    timer = clock(); 
    Calc(); 
    printf("\ncalc time \t%f\n\n", (float)(clock() - timer)); 

    return 0; 
} 
+1

太少的數據來得出任何結論。你的測試是一個非常簡單的測試,只有三秒鐘才能完成。您也正在使用不同的編譯器。 – klutt

+1

您正在測量函數'sin','cos','pow'的不同實現的速度。與編譯器幾乎沒有任何關係。與OS無關。 – Ivan

+0

發佈的代碼不乾淨地編譯!使用:'gcc -c -ggdb -Wall -Wextra -Wconversion -pedantic -std = gnu11'編譯器輸出超過40個警告。 – user3629249

回答

-2

我認爲你的測試是完全有效的,測試結果是準確的。你沒有做錯什麼。您正在測試一個完整的工具鏈,而不僅僅是操作系統。造成差異的主要原因是一個令人傷心的事實,即Linux無法利用硬件加速來實現浮點操作。或者圖形。 trig函數的實現可能存在差異,但我懷疑這些差異是最小的。大多數編譯器提供的運行時間僅使用Fortran設計人員首先規定的原始實現,因爲沒有理由不這樣做。