Por que a função max construída do Haskell é mais rápida do que a minha?

5

Eu notei que, por alguma razão, a função max construída em Haskell (que retorna o maior dos dois números) é executada muito mais rápido do que a que eu escrevi, mesmo sendo essencialmente idênticas.

A partir deste site: link , Descobri que a função max padrão é definida como:

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

que é capaz de executar

foldr max 0 [0..10000000]

em 7,6 segundos (meu laptop está no modo super economia de energia)

Eu escrevi exatamente a mesma função, e corri, e

foldr myMax 0 [0..10000000]

levou uma média de 23,74 segundos

As duas funções parecem idênticas, exceto pelo fato de que o máximo embutido não parece ter uma assinatura de tipo (a menos que esteja oculto em algum lugar).

Alguém sabe o que pode estar acontecendo aqui? Eu duvido seriamente que uma função incorporada funcione mais de três vezes mais rápido que uma idêntica, definida pelo usuário. Para mim, isso seria muito estranho.

(Quando eu digo que eles são idênticos, eu quero dizer literalmente clones um do outro. Apenas para testar, eu o copiei do Prelude, e ainda é significativamente mais lento.)

Edit: Eu pensei sobre isso mais, e eu acho que pode ter algo a ver com as funções incluídas sendo pré-compiladas, onde, como minhas funções estão sendo interpretadas via GHCI (o que faria sentido, então). Vou deixar isso para o caso de alguém ter uma resposta melhor, mas suspeito que seja essa a causa.

(Uma coisa que eu percebi que eu não entendo é por que a GHCI diz que é que compilou meu código depois de uma edição, mas depois diz que está interpretando isso. Você não interpreta o código compilado, não é?)

    
por Carcigenicate 08.07.2014 / 02:09
fonte

1 resposta

5

Quando você carregou a definição para sua própria função max no ghci, você pode não ter notado que o ghci indicou que ela foi interpretada (algo ao longo destas linhas):

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

Para realmente avaliar o desempenho, compile sua definição com ghc e execute o teste novamente. Deve executar aproximadamente a mesma velocidade que a função máxima interna. Não esqueça também da otimização de inclusão (-O2).

    
por 08.07.2014 / 03:41
fonte