2013-07-01 15 views
11

Voglio chiederti cosa può causare questa differenza. Se compilo i seguenti programmi ed eseguo THE SAME BINARIES - su alcune piattaforme quello derivato dal codice C++ è molto più veloce di quello di Haskell, in altri la situazione è opposta.I codici C++ e Haskell differiscono nei tempi di esecuzione su macchine diverse

Inoltre, vi è una grande differenza nelle prestazioni dei binari finali in base alla piattaforma su cui sono stati creati. (Ogni piattaforma utilizza le stesse bandiere e le stesse versioni di LVM e clang)

I codici sono ottimizzati e dovrebbero funzionare con prestazioni simili - vedi: Can Haskell optimize function calls the same way Clang/GCC does?.

Voglio chiederti come è possibile.

codice C++:

#include <cstdio> 
#include <cstdlib> 

int b(const int x){ 
    return x+5; 
} 

int c(const int x){ 
    return b(x)+1; 
} 

int d(const int x){ 
    return b(x)-1; 
} 

int a(const int x){ 
    return c(x) + d(x); 
} 

int main(int argc, char* argv[]){ 
    printf("Starting...\n"); 
    long int iternum = atol(argv[1]); 
    long long int out = 0; 
    for(long int i=1; i<=iternum;i++){ 
     out += a(iternum-i); 
    } 
    printf("%lld\n",out); 
    printf("Done.\n"); 
} 

compilato con il codice clang++ -O3 main.cpp

Haskell:

module Main where 
import qualified Data.Vector as V 
import System.Environment 
b :: Int -> Int 
b x = x + 5 
c x = b x + 1 
d x = b x - 1 
a x = c x + d x 
main = do 
    putStrLn "Starting..." 
    args <- getArgs 
    let iternum = read (head args) :: Int in do 
     putStrLn $ show $ V.foldl' (+) 0 $ V.map (\i -> a (iternum-i)) 
     $ V.enumFromTo 1 iternum 
     putStrLn "Done." 

compilato con ghc -O3 --make -fforce-recomp -fllvm ghc-test.hs

RISULTATI (testare gli stessi file binari su diverse piattaforme)

// binaries compiled on Ubuntu: 
Ubuntu x64 @ Intel i7-3610QM CPU @ 2.30GHz : C++:0.775s, GHC:1.01s 
Gentoo x64 @ Intel i7-Q720 CPU @ 1.6GHz : C++:3.6s, GHC:2.1s 

// binaries compiled on Gentoo: 
Ubuntu x64 @ Intel i7-3610QM CPU @ 2.30GHz : C++:0.782s, GHC:1.01s 
Gentoo x64 @ Intel i7-Q720 CPU @ 1.6GHz : C++:2.3s, GHC:1.3s 
+3

L'output dei compilatori può essere ottimizzato per diversi set di chip. Ripeterò quello che ho detto per la tua ultima domanda: controlla l'output dell'assieme. – chrisaycock

+0

@chrisaycock Non ho visto il tuo commento l'ultima volta - Lo farò –

+14

@ H2CO3: "Il C++ è un linguaggio compilato, Haskell è interpretato." Questo è falso. GHC è un compilatore. Produce codice nativo. Le lingue non sono né interpretate né compilate in modo inerente, ma si può scrivere un interprete o compilatore per qualsiasi linguaggio pratico, incluso il C++. –

risposta

16

Se compilo i seguenti programmi ed eseguire gli stessi file binari - su alcune piattaforme quello provocato da codice C++ è molto più veloce rispetto alla Haskell uno, su altri la situazione è opposta.

Inoltre, vi è una grande differenza nelle prestazioni dei binari finali in base alla piattaforma su cui sono stati creati. (Ogni piattaforma utilizza le stesse bandiere e le stesse versioni di LVM e clang)

Stai visualizzando l'impatto dei dettagli operativi fastidiosi di computer reali:

  • ottimizzazioni del linker
  • diverse versioni di librerie caricate dinamicamente
  • qualità di generazione di codice assembly per un dato micro architettura
  • accesso alle istruzioni specializzate
  • cache di dimensioni del sistema di pianificazione
  • operativo, allocatore, ...
  • latenze di memoria

C'è una massiccia quantità di codice e hardware che differiscono tra le due piattaforme, che significa che si finisce per misurare cose diverse .

Non c'è motivo di aspettarsi che le prestazioni siano uguali o anche nella stessa proporzione. Per i micro-benchmark non è insolito capovolgere gli ordini relativi quando si spostano le piattaforme.

Problemi correlati