O próprio Simon Peyton Jones reconhece que o raciocínio sobre o desempenho em Haskell é difícil devido à semântica não estrita.
Ainda tenho que escrever um projeto significativo em haskell, então me pergunto: posso raciocinar sobre desempenho apenas no início de um projeto (ao escolher estruturas básicas de dados e biblioteca IO) e sempre que surgir um problema, lide com o criador de perfil?
Em outras palavras, é possível (por exemplo, não muito doloroso) adiar o desempenho quando você tiver problemas de desempenho ou precisa aprender a prever como o GHC executará seu código (por exemplo: inferir o que o analisador de rigidez decidirá )?
performance
haskell
Simon Bergot
fonte
fonte
Respostas:
As outras respostas fornecem conselhos amplos sobre o raciocínio de desempenho. Esta resposta trata especificamente de semântica não estrita.
Embora a preguiça torne mais difícil argumentar sobre desempenho, não é tão complicado quanto você imagina. Embora a preguiça seja bastante útil em algumas situações, na maioria das vezes uma linguagem preguiçosa é usada da mesma maneira que uma linguagem estrita seria usada. Conseqüentemente, o raciocínio de desempenho para idiomas estritos pode ser aplicado (com alguns ajustes) a idiomas preguiçosos.
Em termos de complexidade de tempo, a avaliação ávida faz estritamente mais trabalho do que a avaliação preguiçosa. Ambas as estratégias produzem o mesmo resultado na maioria dos casos. (Mais precisamente, se a avaliação ágil não apresentar erros, ela produzirá o mesmo resultado que a avaliação preguiçosa.) Portanto, para raciocinar sobre a complexidade de tempo de um programa Haskell, você pode fingir que ele avalia avidamente. Nas situações pouco frequentes em que a preguiça é importante, essa estimativa será muito alta e deve ser revisada para baixo.
Embora a avaliação preguiçosa ofereça menor complexidade de tempo do que a avaliação antecipada, às vezes oferece maior complexidade de espaço, ou seja, vazamentos de espaço. Maior complexidade de espaço pode ser corrigida adicionando anotações de rigidez para fazer com que um programa seja executado com mais entusiasmo. As ferramentas de criação de perfil são muito boas para rastrear a causa dos vazamentos de espaço. Eu categorizaria isso como depuração de correção ou depuração de desempenho, dependendo da gravidade.
fonte
In terms of time complexity, eager evaluation does strictly more work than lazy evaluation.
Em que você está baseando essa afirmação? Supondo que a avaliação ansiosa termine no mesmo ponto que a avaliação preguiçosa (ou seja, não entrando na avaliação preguiçosa de sequências infinitas e coisas assim), um algoritmo de geração ansiosa será sempre tão rápido ou mais rápido (ou seja, faça menos trabalho) do que um algoritmo preguiçoso porque não exige a sobrecarga de chamadas repetidas em uma rotina de gerador.all even [1..1e10]
uma versão estrita e uma preguiçosaall
. O compilador também tem mais margem de manobra para escolher a ordem da avaliação em uma linguagem como Haskell com coisas como fusão de loop.Otimize as grandes coisas antes de codificar e as pequenas coisas quando terminar.
Por exemplo, antes de começar a codificar, você deve pensar no seguinte:
...e assim por diante.
Então, quando você estiver quase terminando o seu código, pense nas pequenas coisas como qual função interna é mais rápida, devo reescrever essa área de código para torná-la mais eficiente etc.
Isso vale para qualquer idioma e realmente depende do tipo de software que você está escrevendo. Haskell é uma linguagem de uso geral, então você provavelmente (me corrija se eu estiver errado) não fazendo nada que precise ser extremamente rápido. Nesse caso, você deve usar um idioma de nível inferior. Se a velocidade é um problema, mas não o suficiente para usar um idioma de baixo nível, você deve otimizar seu desempenho com base no exposto acima.
Obviamente, todo mundo faz as coisas de maneira diferente; portanto, se sua experiência pessoal faz você pensar que deveria fazê-lo de maneira diferente com base na sua situação, provavelmente deveria.
fonte
Eu gostaria de adicionar à resposta do Dynamic:
Quando você perceber mais tarde no desenvolvimento quais gargalos seu código possui, pode ser realmente doloroso refatorar todo o projeto. Se o seu código estiver bem estruturado, os gargalos serão mais fáceis de encontrar e otimizar / corrigir.
fonte