İşlevsel programlama, genel bir kural olarak, daha hızlı programlar için yapmaz. Yaptığı şey daha kolay paralel ve eşzamanlı programlama içindir. Bunun için iki ana anahtar var:
- Değişebilir durumdan kaçınılması, bir programda yanlış gidebilecek şeylerin sayısını ve daha fazlasını eşzamanlı bir programda azaltma eğilimindedir.
- Paylaşılan hafızanın ve kilit tabanlı senkronizasyon ilkellerinin daha üst düzey kavramlar lehine önlenmesi, kod konuları arasındaki senkronizasyonu basitleştirme eğilimindedir.
2 no'lu noktanın mükemmel bir örneği Haskell'de deterministik paralellik ve deterministik olmayan eşzamanlılık arasında açık bir ayrım olduğumuzdur . Simon Marlow'un Haskell'deki Mükemmel Paralel ve Eşzamanlı Programlama kitabından alıntı yapmaktan daha iyi bir açıklama yok (alıntılar Bölüm 1'den alınmıştır ):
Bir paralel program daha hızlı bir hesaplama yapmak için hesaplama donanımının (örneğin birkaç işlemci çekirdek) çok sayıda kullanan biridir. Amaç, hesaplamanın farklı bölümlerini aynı anda çalışan farklı işlemcilere devrederek daha erken bir cevaba ulaşmaktır.
Buna karşılık, eşzamanlılık , birden fazla denetim dizisinin olduğu bir program yapılandırma tekniğidir. Kavramsal olarak, kontrol iplikleri “aynı anda” yürütülür; yani kullanıcı etkilerini araya eklenmiş olarak görür. Aslında aynı anda mı çalıştıkları ya da uygulanmadıkları bir uygulama detayıdır; eşzamanlı bir program tek bir işlemcide bir araya getirilmiş işlem veya birden çok fiziksel işlemcide gerçekleştirilebilir.
Buna ek olarak, Marlow da determinizmin boyutunu ortaya çıkarır :
İlişkili bir ayrım deterministik ve klasik olmayan programlama modelleri arasındadır. Deterministik bir programlama modeli, her programın sadece bir sonuç verebileceği bir modeldir; oysa, klasik olmayan bir programlama modeli, uygulamanın bir yönüne bağlı olarak farklı sonuçlara sahip olan programları kabul eder. Eşzamanlı programlama modelleri mutlaka belirleyici değildir, çünkü öngörülemeyen zamanlarda olaylara neden olan dış ajanlarla etkileşime girmeleri gerekir. Nondeterminizm bazı kayda değer dezavantajlara sahiptir, ancak: Programların test edilmesi ve bununla ilgili sebepler oldukça zorlaşır.
Paralel programlama için mümkünse deterministik programlama modellerini kullanmak istiyoruz. Amaç sadece cevaba daha hızlı bir şekilde ulaşmak olduğundan, programımızı süreçte hata ayıklamayı zorlaştırmayacağız. Deterministik paralel programlama her iki dünyanın da en iyisidir: Ardışık programda test etme, hata ayıklama ve mantık yürütme yapılabilir, ancak program daha fazla işlemci eklenerek daha hızlı çalışır.
Haskell'de paralellik ve eşzamanlılık özellikleri bu kavramlar etrafında tasarlanır. Özellikle, hangi dillerin bir özellik seti olarak bir araya geldiğini, Haskell ikiye ayırır:
- Paralellik için deterministik özellikler ve kütüphaneler .
- Deterministik olmayan özellikler ve eşzamanlılık için kütüphaneler .
Yalnızca saf ve deterministik bir hesaplamayı hızlandırmaya çalışıyorsanız, deterministik paralelliğe sahip olmak işleri çok daha kolaylaştırır. Genellikle böyle bir şey yaparsınız:
- Her biri hesaplaması pahalı olan ancak birbirlerine çok fazla bağlı olmayan yanıtların listesini üreten bir işlev yazın. Bu Haskell, bu yüzden listeler tembeldir - öğelerinin değerleri aslında bir tüketici talep edene kadar hesaplanmaz.
- İşlevinizin sonuç listelerinin öğelerini birden fazla çekirdeğe paralel olarak tüketmek için Stratejiler kitaplığını kullanın .
Aslında bunu birkaç hafta önce oyuncak proje programlarımdan biriyle yaptım . Programı paralel hale getirmek çok önemliydi; yapmam gereken en önemli şey, aslında "bu listenin öğelerini paralel olarak hesapla" diyen bir kod eklemek (satır 90), ve daha pahalı test durumlarımdan bazıları.
Programım, geleneksel kilit tabanlı çok iş parçacığı hizmet programlarına girdiğimden daha mı hızlı? Ben çok şüpheliyim. Benim durumumdaki temiz şey çok az para kazanmaktan çok etkileniyordu - kodum muhtemelen çok yetersizdi, ancak paralelleştirmek çok kolay çünkü düzgün bir şekilde profillemekten ve optimize etmekten çok daha az bir çaba ile büyük bir hız kazandım. ve yarış koşulları riski yoktur. Ve bence, işlevsel programlamanın “daha hızlı” programlar yazmanıza izin verdiği ana yoldur.