Aggiornamento: L'elisir non è lento, il mio algoritmo era. I miei algoritmi non erano nemmeno il confronto tra mele e mele. Vedi le risposte di Roman in basso per gli algoritmi equivalenti di Ruby and Go. Anche grazie a José, il mio algoritmo lento può essere velocizzato in modo significativo semplicemente prefissando MIX_ENV = prod. Ho aggiornato le statistiche nella domanda.Perché l'elisir è il più lento tra Ruby e Go nel risolvere Project Euler # 5?
domanda originale: Sto lavorando a problemi di Project Euler in più lingue solo per vedere quanto sono produttive e quanto veloci sono le lingue. In problem #5, viene chiesto di trovare il numero positivo più piccolo che sia uniformemente divisibile per tutti i numeri da 1 a 20.
Ho implementato la soluzione in più lingue. Ecco le statistiche:
- Go 1.4.2: 0.58s
- Rubino 2.2 MRI: 6.7s
- Elixir 1.0.5 (il mio primo algoritmo): 57s
- Elixir 1.0.5 (il mio primo algoritmo con MIX_ENV = prefix prod): 7.4s
- Elixir 1.0.5 (Go algoritmo equivalente di Roman): 0.7s
- Elixir 1.0.5 (rubino algoritmo equivalente di Roman): 1.8s
Perché le prestazioni di Elixir sono così lente? Ho provato a utilizzare le stesse ottimizzazioni in tutte le lingue. Avvertenza: Sono un principiante di FP ed Elixir.
C'è qualcosa che posso fare per migliorare le prestazioni in elisir? Se hai utilizzato strumenti di profilazione per trovare una soluzione migliore, potresti includerli nella risposta?
In Vai:
func problem005() int {
i := 20
outer:
for {
for j := 20; j > 0; j-- {
if i%j != 0 {
i = i + 20
continue outer
}
}
return i
}
panic("Should have found a solution by now")
}
In Ruby:
def self.problem005
divisors = (1..20).to_a.reverse
number = 20 # we iterate over multiples of 20
until divisors.all? { |divisor| number % divisor == 0 } do
number += 20
end
return number
end
In Elixir:
def problem005 do
divisible_all? = fn num ->
Enum.all?((20..2), &(rem(num, &1) == 0))
end
Stream.iterate(20, &(&1 + 20))
|> Stream.filter(divisible_all?)
|> Enum.fetch! 0
end
Non riesco a spiegare il vostro elisir, ma ci sono quasi certamente modi migliori per risolvere questo problema, ad es prova e costruisci il numero piuttosto che scansionarlo. – Rup
Grazie, Rup. Proverò questo suggerimento. Tuttavia, la mia domanda qui è puramente legata alle prestazioni di una logica simile è di 3 lingue diverse. –
Se si esegue il benchmarking del codice Elixir, assicurarsi di eseguirne il benchmark con MIX_ENV = prod, in modo che Elixir compili il progetto nel modo più efficiente possibile. Altrimenti, stai ottenendo prestazioni non ottimali. –