Önceki sorularda işlevsel programlama dillerinin fizik motoru gibi dinamik sistemler için uygun olmadığı söylendi, çünkü esasen nesneleri değiştirmek pahalıya mal oldu. Bu ifade ne kadar gerçekçi ve neden?
Önceki sorularda işlevsel programlama dillerinin fizik motoru gibi dinamik sistemler için uygun olmadığı söylendi, çünkü esasen nesneleri değiştirmek pahalıya mal oldu. Bu ifade ne kadar gerçekçi ve neden?
Yanıtlar:
Hem Haskell hem de Clojure gerçek değişime izin verir, bu yüzden başlamak bir sorun değildir.
Bunun ötesinde, "değiştirilebilir" verileriniz, bazı büyük hesaplamaların bir parçası olarak aşamalı olarak güncellenen ara değerlerden oluşuyorsa, verimli olmak için değişime bile ihtiyacınız olmayabilir! Örneğin, Haskell'de , derleyicinin ara veri yapılarını tamamen ortadan kaldırmak için işleme döngülerini, veri üreticilerini ve veri tüketicilerini kaynaştırdığı akış füzyonu adı verilen bir teknikle ilgili devam eden araştırmalar var .
Burada Haskell ile ilgili ana sorun tembelliktir - çok fazla giriş verisine ve çok sayıda çıkış verisine sahip olduğunuz bir sayı gevreklik programında ve hepsi önemlidir, tembellik size çok az iyilik yapar, ancak yine de biraz ek yük getirir. Bu, Haskell'de böyle programlar yazamayacağınız anlamına gelmez (aslında insanlar yapar), ancak dilin güçlü yönlerini oynamıyor ve istediğiniz performansı elde etmek için değerlendirme modelini daha iyi anlamanız gerekiyor.
Bununla birlikte, ağır sayıdaki çatırdama da JVM'nin güçlü yönlerine uymuyor. Bu tür bir program FORTRAN'ın hala etrafta olmasının nedenidir.
Clojure için konuşamam, ancak Haskell'de, istediğiniz tüm mutasyona izin verecek çok fazla ayarlanmış IO paketi var diyebilirim.
İşte birisinin en yaygın 3 tanesini detaylandırdığı ve performanslarıyla ilgili olduğu bir soruya cevap: /programming/15439966/when-why-use-an-mvar-over-a-tvar/15440286 # 15440286
Burada , yüksek derecede IO yoğun bir uygulama olan Warp adlı bir haskell web sunucusunun performans metriklerini gösteren basit bir grafik de görebilirsiniz .
Haskell ile ilgili bu konuda çok fazla kafa karışıklığı var, gerçek şu ki, çoğu yüksek derecede ayarlanmış IO'yu kullanmak için hackage üzerinde birçok pakete sahip fantastik IO tesisleri var. İnsanların bunu kabul etmesinin nedeni, Haskell'in IO'yu diğer her şeyden ayırmak için büyük çaba sarf etmesidir, ancak bunun performans özellikleri üzerinde hiçbir etkisi yoktur.
Ancak şimdi performans özellikleri hakkında konuşmak gerekirse, insanların bunu düşük performansa sahip olarak tanımasının nedeni, tembel değerlendirmenin her zaman sezgisel olmayan şekillerde davranmasına neden olmasından kaynaklanmaktadır. Ancak bu, bahsettiğiniz bir sistem gibi yıkıcı güncellemeler yaparak bir IO bağlamında çalışmaya başladığınızda çok daha az endişelenmeniz gereken bir şeydir. Daha fazla insan, performans sorunları yaşarken, kaynakların nereye gideceğini belirlemek ve tespit etmek için yerleşik tesislerin çok yardımcı olduğunu bulma eğilimindedir.
Açıkladığınız gibi bir sisteme bakmaya değer başka bir monad , özellikle çok küçük IO çağrıları tarafından yapılan yıkıcı güncellemeler için mükemmel performans sağlayan ST monad olacaktır .
Maalesef Clojure ile konuşamıyorum, umarım başka biri ayrıntı verebilir.
Due to the functional programming style the computational load will be distributed over the available CPU cores which can dramatically increase processing speed in some cases