2015-07-20 20 views
12

Ultimamente ho letto da qualche parte che la corrispondenza del modello avviene durante l'esecuzione e non in fase di compilazione. (Sto cercando la fonte, ma non la trovo al momento.) È vero? E se sì, le guardie nelle funzioni hanno le stesse prestazioni?La corrispondenza del modello è più performante rispetto alle guardie?

Leggere questo è stato sorprendente per me perché ero solito pensare che GHC fosse in grado di ottimizzare alcune (probabilmente non tutte) le decisioni di corrispondenza dei pattern durante la compilazione. Questo succede mai?

Un caso per esempio:

f 1 = 3 
f 2 = 4 

vs

f' a | a == 1 = 3 
    | a == 2 = 4 

fare f e f' compilare per lo stesso numero di istruzioni (per esempio in Core e/o inferiore)?

La situazione è diversa se I pattern corrisponde a un costruttore anziché a un valore? Per esempio. se GHC vede che una funzione da una posizione viene sempre invocata con un costruttore, ottimizza tale chiamata in modo tale da eliminare il controllo run-time? E se sì, puoi darmi un esempio che mostra cosa produce l'ottimizzazione?

In sintesi

ciò che è buono da sapere su questi due approcci in termini di prestazioni?

Quando è preferibile il rendimento?

+4

Stai chiedendo come ottenere l'output principale da GHC o come utilizzare il criterio? – jberryman

+1

Rilevante: [Haskell GHC: qual è la complessità temporale di un pattern che corrisponde a N costruttori?] (Http://stackoverflow.com/q/9027384/2751851) – duplode

+0

Preferisco pensare che la corrispondenza dei pattern sia più veloce, considerando che le istanze di 'Eq' sono in genere basate sulla corrispondenza del modello in ogni caso. – AJFarmar

risposta

14

Non importa schemi e guardie, potresti anche chiedere di if rispetto a case.

L'abbinamento del motivo è preferibile ai controlli di uguaglianza. Il controllo delle uguaglianze non è una cosa naturale da fare in Haskell. Boolean blindness è un problema, ma a parte questo controllo completo dell'uguaglianza spesso non è fattibile –, ad es. le liste infinite non saranno mai uguali!

Quanto più efficiente la corrispondenza diretta del modello dipende dal tipo. In caso di numeri, non aspettarti molta differenza poiché questi modelli sono sotto il cofano implementati con controlli di uguaglianza.

Io generalmente preferisco i modelli – perché sono solo più belli e può essere più efficiente.. I controlli di uguaglianza saranno sia tanto costosi, o forse più costosi, e sono semplicemente poco idiomatici. Utilizzare solo la valutazione booleana quando necessario, altrimenti attenersi ai modelli (che possono essere anche in guards)!

Problemi correlati