更新: Elixir は遅くはありません。私のアルゴリズムはそうでした。私のアルゴリズムは、リンゴとリンゴの比較でさえありませんでした。Ruby と Go の同等のアルゴリズムについては、以下の Roman の回答を参照してください。また、José のおかげで、MIX_ENV=prod というプレフィックスを付けるだけで、遅いアルゴリズムを大幅に高速化できます。質問の統計を更新しました。
元の質問: 言語の生産性と速度を確認するためだけに、複数の言語で Project Euler の問題に取り組んでいます。問題 5では、1 から 20 までのすべての数で割り切れる最小の正の数を見つけるように求められます。
ソリューションを複数の言語で実装しました。統計は次のとおりです。
- 1.4.2 に行く: 0.58 秒
- Ruby 2.2 MRI : 6.7 秒
- Elixir 1.0.5 (私の最初のアルゴリズム): 57 秒
- Elixir 1.0.5 (MIX_ENV=prod プレフィックスを使用した最初のアルゴリズム): 7.4 秒
- Elixir 1.0.5 (Roman's Go と同等のアルゴリズム) : 0.7 秒
- Elixir 1.0.5 (Roman's Ruby と同等のアルゴリズム) : 1.8 秒
Elixir のパフォーマンスが遅いのはなぜですか? すべての言語で同じ最適化を使用してみました。警告: 私は FP と Elixir の初心者です。
Elixir のパフォーマンスを改善するためにできることはありますか? より良い解決策を見つけるためにプロファイリング ツールを使用した場合は、それらを回答に含めていただけますか?
囲碁:
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")
}
ルビーの場合:
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
エリクサーでは:
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