Bunun nedeni hem Enum.map/2
ve farklı listenin uzunluğu testlerin
elements |> Enum.count(&check/1)
elements |> Enum.map(&(if check(&1), do: 1, else: 0)) |> Enum.sum
sonuçları:
bu iki gruplarını karşılaştırma Enum.reduce/3
(Butarafından kullanılır 0) listeler için büyük ölçüde optimize edilmiştir, Enum.count/2
ise sadece jenerik sayılabilir bir versiyona sahiptir. Benim makinede
elements |> Enum.filter(&check/1) |> Enum.count
ben tutarlı bir sonuç almak sağlanan modifiye kriter kullanılarak:
bile daha hızlı bir uygulama var, karışıklığa eklemek için adı geçen
len = 10
map: 2.1706 μs
count: 7.0754 μs
filter: 1.9765 μs
len = 100
map: 19.921 μs
count: 27.579 μs
filter: 14.591 μs
len = 1000
map: 168.93 μs
count: 178.93 μs
filter: 163.43 μs
len = 10000
map: 2128.9 μs
count: 1822.1 μs
filter: 1664.6 μs
hem " map "ve" filter "versiyonu çalıştıklarında daha fazla çöp üretirler, bu nedenle zaman kazanımlarının bir kısmı genişletilmiş çöp toplama zamanı tarafından tüketilebilir. Bu, kıyaslamalarda zaten görülebilir, çünkü versiyonlar arasındaki göreceli kazanımlar, listenin uzunluğu (ve üretilen ara çöp miktarı) arttıkça azalır.
DÜZENLEME: Enum.count/2
işlevi en hızlı bir https://github.com/elixir-lang/elixir/pull/5567
kodunuzu numaralandırma kodunun performansına bağlıdır mı olmak optimize eden bir PR ibraz? Çünkü gerçekten bu kadar önemli olmadıkça, bu beni anlama maliyetinde optimizasyon olarak vurur. Demek istediğim, bu kodu koruyan herkesin, Enum.count ile "Enum.map |> Enum.sum" ile ne yaptığınızı anlaması daha kolay olacaktır. Yani bu kodun performansı kritik değilse, eskiyi tercih ederim. –
Evet, kodum bu işlevin performansına bağlıdır. Kodun okunabilmesi için kendi count() işlevini oluşturdum. – raacer