En Hızlı İşlevsel Dil


18

Son zamanlarda özellikle daha önce Haskell ve F #, fonksiyonel programlama üzerinde çalışıyorum. Bazı googling sonra daha belirgin fonksiyonel diller (Scala, F # vb) bir karşılaştırma karşılaştırma bulamadık.

Hibrit oldukları göz önüne alındığında, bazı diller için adil olmayacağını biliyorum (Scala akla geliyor), ama sadece hangi operasyonlarda ve genel olarak hangisinin daha iyi performans gösterdiğini bilmek istiyorum.


18
Diller hızlı veya yavaş değil, uygulamalar.
starblue

6
Dil uygulamaları hızlı veya yavaş değildir, bu dil uygulamaları kullanılarak çalıştırılan programlar (diğer bazı programlarla karşılaştırıldığında) vardır. Hayırsever olun - birisi bir programlama dilinin diğerinden daha hızlı olduğundan bahsettiğinde, mantıklı olan yol, belirli dil uygulamalarını kullanarak çalışan belirli programlar hakkında konuştuklarını anlamaktır.
igouy

3
@starblue: Bu çok glib bir cevap ve çok yararlı değil. Aynı dilden biri diğerinden daha yavaş olan iki uygulama oluşturmak kesinlikle mümkün olsa da, oraya koyma şekliniz, diğer dillerin uygulamalarında belirli verimsizlikleri zorunlu olarak gerektiren dil tasarım ayrıntılarının mevcut olmadığını ima eder. tasarım, gerekmez. Ve bu doğru değil. (Özellikle bu konuda; fonksiyonel diller onlar için kötü şöhretlidir!)
Mason Wheeler

3
@igouy "Dil uygulamaları hızlı veya yavaş değil" Bu doğru değil. CPythonvs PyPyhızla akla geliyor.
NlightNFotis

@NlightNFotis - CPython kaç saniye sürüyor? PyPy kaç saniye sürüyor? Dil uygulamaları hızlı veya yavaş değildir. Bu program CPython ile kaç saniye sürüyor?
igouy

Yanıtlar:


25

Göre Büyük Deneyler Oyun , ATS hızlı Haskell, Scala ile geri kalanından daha olduğunu ve birinin arkasında hız yakın bir kaba kravat Ortak Lisp varyantları. Bundan sonra Ocaml ve F #, Racket ve Clojure geride kalırken kabaca aynı hız kategorisinde ...

Ancak, bunların neredeyse hiçbiri gerçekten hiçbir şey ifade etmiyor. Her şey bir sorun, makine, derleyici, kodlama teknikleri ve bazı durumlarda düz şans sorunudur. Genel olarak, Haskell gibi doğrudan makine kodlu diller F # gibi VM derlenmiş dillerden daha iyi performans gösterecek ve tamamen yorumlanmış dillerden daha iyi performans gösterecektir. Ayrıca genel olarak, statik olarak yazılan diller, statik analiz nedeniyle dinamik olarak yazılanlardan daha hızlıdır ve tüm tür işlemlerinin çalışma süresi yerine derlemede hesaplanmasını sağlar. Yine, bunlar genel kurallar, her zaman istisnalar olacak. "Paradigmalar" ın bununla pek bir ilgisi yoktur.


Göz önünde bulundurulması gereken birçok faktör olduğunu biliyorum ve her şey mükemmel olsa bile farklı veriler üzerinde farklı performans gösterebilirler, sorum oldukça belirsiz. Bağlantı için teşekkürler, gerçekten yararlı - ATS'nin bu kadar hızlı olduğunu hiç bilmiyordum
Farouk

Detaylı karşılaştırma bilgileri ile güzel bir bağlantı. Clojure'un çok daha fazla bellek kullandığını ve Java'dan çok daha uzun sürdüğünü hayal kırıklığına uğrattım. Clojure'un benzer bir performansa sahip olduğunu iddia ediyorum, durum böyle görünmüyor.
DPM

ATS web sitesi, ATS'nin çeşitli programlama paradigmalarını desteklediğini belirtir - bu nedenle ATS'nin geri kalanından daha hızlı olduğunu iddia etmeden önce, bu programların aslında işlevsel bir tarzda yazıldığını göstermeniz gerekir. Fonksiyonel ATS'nin diğerlerinden daha hızlı olmaması olabilir.
igouy

2
Scala web sitesi, Scala'nın nesne yönelimli ve işlevsel özellikleri entegre ettiğini belirtir. Scala programlarının nesneye yönelik programlar yerine işlevsel programlar olarak yazıldığını kontrol ettiniz mi?
igouy

12

Ayrıca, bir programlama dilinin performansını ölçemeyeceğinizi / ölçemeyeceğinizi de belirtmek gerekir . Yapabileceğiniz en iyi şey, belirli programları çalıştırarak dilin belirli platformlarda belirli bir uygulamasının performansını ölçmektir .

Yani "en hızlı işlevsel dil" hakkında soru sorduğunuzda, dil (ler) in güncel uygulamalarından en iyi olanı gerçekten soruyorsunuz.


@ igouy'un yorumu, dil uygulaması için başka performans önlemleri olduğu noktasını gündeme getiriyor ; örneğin derleme zamanı. Ancak bu, uygulama programının çalışma süresinin dilin bir ölçüsü değil, bir dilin uygulamasının (dolaylı) bir ölçüsü olduğu gerçeğini değiştirmez.

Örneğin Java'yı düşünün. Klasik (Java 1.0) Java'nın yalnızca dil özelliklerini kullanarak tek iş parçacıklı bir karşılaştırma ölçütü yazdığımı varsayalım. JDK 1.0 kullanarak derleyip çalıştırırsam kötü bir performans elde edeceğim (çünkü JDK 1.0'ın yerel kod derleyicisi yoktu). JDK 1.1'den ... JDK 1.7'ye gidersem, büyük olasılıkla giderek daha iyi sonuçlar elde edeceğim. Ancak bu Java dilindeki değişikliklerden kaynaklanmıyor ... çünkü karşılaştırmam aynı dil alt kümesini kullanıyor. Aksine, hızlanma derleyicilerdeki, çalışma zamanı sistemindeki ve / veya sınıf kütüphanelerinin uygulanmasından kaynaklanmaktadır. Bunların hepsi uygulama sorunları.

Diğer bir nokta, bu uygulama farklılıklarının aynı dil için gerçekten önemli (örneğin büyüklük dereceleri) olabilmesidir. Bu nedenle, X dili için en iyi uygulamanın Y dilinin en iyi (veya yalnızca) uygulanmasından daha hızlı olması , size dilin kendisi hakkında çok fazla şey anlatmak zorunda değildir .


Yapabileceğiniz en iyi şey belirli programların performansını ölçmektir. Bir dil uygulamasının performansını ölçtüğümüzde, programın ne kadar sürdüğünü değil, bir programı derlemenin ne kadar sürdüğünü öğrenmek istiyoruz.
igouy

Programın çalışma süresi, söz konusu donanım vb. Üzerinde belirli bir dil uygulamasını kullanarak çalıştırıldığında söz konusu programın bir özelliğidir. Programın çalışma süresinin dilin bir özelliği olmadığı göz önüne alındığında, bu bağlamda dil adının bilinen dil uygulamaları için kestirme yol olarak kullanılmaktadır.
igouy

@igouy - bu doğru. Ancak birçok kişi, "Java yavaştır." Ne yazık ki, bu saçmalık tam anlamıyla bir nesil programcı tarafından okundu ... ve Java'nın itibarını önemli ölçüde bozdu. bu noktaya BURADAN
Stephen C

Söyleyecek özgürlüğüne sahip istediğimizden - "Bir dilin uygulamasının bir (dolaylı) ölçüsü" - başkası söylemekte özgür olmamalı nedenini açıklayın - Bir dilin bir (dolaylı) ölçü .
igouy

@igouy - 1) Ne istediğini söylemekte özgürsün. Ama bu seni düzeltmiyor. 2) Bir dilin tek uygulanmasının saçma olduğu durumu düşünün. Bunu kıyaslıyoruz. Ardından uygulamayı güncelliyoruz, karşılaştırıyoruz ve performans önemli ölçüde iyileşti. Bu, dil performansının iyileştiği anlamına mı geliyor? Bu nasıl bir anlam ifade ediyor ... dilin DEĞİŞTİRİLMEMESİ nedeniyle !!!
Stephen C

6

Dile yalnızca yürütme hızında bakıyorsanız, bazı önemli noktaları kaçırıyorsunuz. Hız iyi bir şey, ama tek şey değil.

Haskell, hatasız ve sağlam olma olasılığı daha yüksek olan programlar oluşturmak için çok sağlam bir sistem kullanır.

Erlang, çeşitli arıza türlerinde size büyük bir güvenilirlik düzeyi sağlayabilen arıza sistemleri oluşturmanıza izin vermek için yerleşik izleme sistemini kullanır. Ek olarak Erlang, diğer dillerde eşleşmesi zor bir eşzamanlılık düzeyi de sağlayabilir.

Gerçekte, günümüzdeki uygulama hızının, çoğu durumda neleri dikkate alacağımın listesinde oldukça aşağı olduğunu düşünürdüm. (Eğer büyük bir sayısal hesaplama yapıyorsam, muhtemelen hız için fortran kullanmak isterdim ama aksi takdirde önemli olan sadece önemli değil)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.