Perché la funzione max di Haskell integrata è più veloce della mia?

5

Ho notato che, per qualche motivo, la funzione max di Haskell (che restituisce il massimo di due numeri) è molto più veloce di quella che ho scritto, anche se sono essenzialmente identici.

Da questo sito: link , Ho scoperto che la funzione massima standard è definita come:

    max x y 
     | x <= y    =  y
     | otherwise =  x

che è in grado di eseguire

foldr max 0 [0..10000000]

in 7,6 secondi (il mio laptop è in modalità risparmio energetico)

Ho scritto la stessa identica funzione e l'ho eseguita, e

foldr myMax 0 [0..10000000]

ha avuto una media di 23,74 secondi

Le due funzioni sembrano identiche, tranne per il fatto che il valore max incorporato non sembra avere una firma di tipo (a meno che non sia nascosto da qualche parte.)

Qualcuno sa cosa potrebbe succedere qui? Dubito seriamente che una funzione integrata funzioni più di tre volte più velocemente di una identica, definita dall'utente. Per me sarebbe molto strano.

(Quando dico che sono identici, intendo letteralmente cloni l'uno dell'altro. Solo per testare, I C è uscito dal Preludio, ed è ancora molto più lento.)

Modifica: ci ho pensato di più, e penso che potrebbe avere qualcosa a che fare con le funzioni incluse che sono precompilate, dove -come le mie funzioni sono interpretate tramite GHCI (che avrebbe senso allora). Lascerò presente nel caso qualcuno abbia una risposta migliore, ma sospetto che sia la causa.

(Una cosa che ho capito che non capisco è perché GHCI dice che è compilato il mio codice dopo una modifica, ma poi continua dicendo che è interpretarlo. Non interpreti il codice compilato, vero?)

    
posta Carcigenicate 08.07.2014 - 02:09
fonte

1 risposta

5

Quando hai caricato la definizione della tua funzione max in ghci, potresti non aver notato che ghci ha indicato che è stato interpretato (qualcosa di simile):

Prelude> :l mymax.hs
[1 of 1] Compiling Main             ( mymax.hs, interpreted )
Ok, modules loaded: Main.

Per poter davvero confrontare le prestazioni, compilare la definizione con ghc ed eseguire nuovamente il test. Dovrebbe essere eseguito all'incirca alla stessa velocità della funzione built-max. Non dimenticare anche l'ottimizzazione inclusione (-O2).

    
risposta data 08.07.2014 - 03:41
fonte

Leggi altre domande sui tag