A princípio eu gostaria de justificar ruby e dizer que este é o problema comum de linguagens com sistema de tipo dinâmico
Recentemente, estive trabalhando em uma aplicação rails e notei uma grande lentidão (cerca de 7-8 segundos) em uma página específica. Depois de um tempo, descobri a causa – a classe NewtonRaphsonIrrCalculator ( https://code.google.com/p/irr-newtonraphson-calculator/downloads/list )
A criação de perfil revelou grandes quantidades de chamadas BigDecimal # coerce. A classe fazia todos os cálculos com este tipo, embora se você vir a fonte não encontrará nenhuma referência de BigDecimal. Então, de onde veio o BigDecimal? Daqui:
def self.calculate(flows, max_iterations=100, initial_guess=nil)
A matriz de fluxos consistia em instâncias BigDecimal.
Então eu pensei que talvez faça sentido realizar todos os cálculos dentro de NewtonRaphsonIrrCalculator com BigDecimals para evitar #coerce calls. Bem, isso não fez muita diferença. Ainda demorou cerca de 6 segundos.
No final, decidi converter a matriz de fluxos em matriz de flutuadores
def cash_flows=(cash_flows)
@cash_flows = cash_flows.map {|flow| flow.to_f}
end
Agora o método de cálculo leva menos de um segundo e a saída é a mesma. Yay! Portanto, a conclusão é – os tipos são importantes e negligenciá-los pode custar-lhe problemas de desempenho e memória.