Bahasa Fungsional Tercepat

18

Saya baru-baru ini mempelajari pemrograman fungsional terutama Haskell dan F #, sebelumnya lebih dari itu. Setelah beberapa googling di sekitar saya tidak dapat menemukan perbandingan benchmark bahasa fungsional yang lebih menonjol (Scala, F # dll).

Saya tahu itu tidak selalu adil untuk beberapa bahasa (Scala datang ke pikiran) mengingat bahwa mereka adalah hibrida, tapi saya hanya ingin tahu yang mengungguli yang pada operasi apa dan secara keseluruhan.

Farouk
sumber
18
Bahasa tidak cepat atau lambat, implementasinya.
starblue
6
Implementasi bahasa tidak cepat atau lambat, program berjalan menggunakan implementasi bahasa tersebut (bila dibandingkan dengan beberapa program lain). Beramal - ketika seseorang berbicara tentang satu bahasa pemrograman lebih cepat dari yang lain, cara yang jelas masuk akal adalah untuk memahami bahwa mereka berbicara tentang program-program tertentu yang dijalankan menggunakan implementasi bahasa tertentu.
igouy
3
@ starblue: Itu jawaban yang sangat fasih, dan bukan yang sangat membantu. Meskipun tentu saja mungkin untuk membuat dua implementasi dari bahasa yang sama, salah satunya lebih lambat dari yang lain, cara Anda menaruhnya di sana menyiratkan bahwa tidak ada detail desain bahasa yang perlu memerlukan inefisiensi tertentu dalam implementasi yang bahasa lain, oleh mereka desain, tidak perlu. Dan itu tidak benar. (Terutama dalam topik khusus ini; bahasa fungsional terkenal karena hal itu!)
Mason Wheeler
3
@igouy "Implementasi bahasa tidak cepat atau lambat" Ini tidak benar. CPythonvs PyPycepat terlintas dalam pikiran.
NlightNFotis
@NlightNFotis - Berapa detik yang dibutuhkan CPython? Berapa detik yang diperlukan oleh PyPy? Implementasi bahasa tidak cepat atau lambat. Berapa detik yang dibutuhkan oleh program itu dengan CPython?
igouy

Jawaban:

25

Menurut Great Benchmarks Game , ATS lebih cepat daripada yang lain dengan Haskell, Scala, dan salah satu varian Common Lisp dalam ikatan kasar untuk kecepatan yang dekat di belakangnya. Setelah itu Ocaml dan F # berada dalam kategori kecepatan yang kira-kira sama dengan Racket dan Clojure tertinggal ...

Namun, hampir tidak ada yang benar-benar berarti. Ini semua masalah masalah, mesin, kompiler, teknik pengkodean, dan dalam beberapa kasus, keberuntungan. Secara umum, bahasa kode mesin langsung seperti Haskell akan mengungguli bahasa yang dikompilasi VM seperti F # dan jauh mengungguli bahasa murni ditafsirkan. Juga secara umum, bahasa yang diketik secara statis lebih cepat daripada yang diketik secara dinamis karena analisis statis memungkinkan semua operasi jenis dikalkulasi pada saat kompilasi daripada pada saat dijalankan. Sekali lagi, ini adalah aturan umum, akan selalu ada pengecualian. "Paradigma" tidak ada hubungannya dengan itu.

Insinyur Dunia
sumber
Saya tahu ada banyak faktor yang perlu dipertimbangkan dan bahkan jika semua hal sempurna mereka mungkin melakukan berbeda pada data yang berbeda, pertanyaan saya cukup samar. Terima kasih atas tautannya, sangat membantu - Saya tidak pernah tahu ATS secepat itu
Farouk
Tautan yang bagus dengan informasi perbandingan terperinci. Saya agak kecewa melihat Clojure menggunakan lebih banyak memori dan mengambil secara signifikan lebih lama dari Java. Saya ingat beberapa klaim tentang Clojure memiliki kinerja yang sama, yang tampaknya tidak menjadi masalah.
DPM
Situs web ATS menyatakan bahwa ATS mendukung berbagai paradigma pemrograman - jadi sebelum Anda mengklaim ATS lebih cepat daripada yang lain, Anda perlu menunjukkan bahwa program-program tersebut sebenarnya ditulis dalam gaya fungsional. Mungkin saja ATS fungsional tidak lebih cepat dari yang lain.
igouy
2
Situs web Scala menyatakan bahwa Scala mengintegrasikan fitur berorientasi objek dan fungsional. Sudahkah Anda memeriksa bahwa program Scala ditulis sebagai program fungsional daripada program berorientasi objek?
igouy
12

Juga harus ditunjukkan bahwa Anda tidak dapat mengukur / mengukur kinerja bahasa pemrograman . Yang terbaik yang dapat Anda lakukan adalah mengukur kinerja implementasi bahasa tertentu pada platform tertentu, menjalankan program tertentu.

Jadi ketika Anda bertanya tentang "bahasa fungsional tercepat", apa yang sebenarnya Anda tanyakan tentang yang terbaik dari implementasi bahasa saat ini.


Komentar @ igouy memunculkan poin bahwa ada ukuran kinerja lain untuk implementasi bahasa; misal waktu kompilasi. Tapi itu tidak mengubah fakta bahwa waktu menjalankan program aplikasi adalah ukuran (tidak langsung) dari implementasi bahasa, bukan ukuran dari bahasa itu sendiri.

Pertimbangkan Java sebagai contoh. Misalkan saya menulis tolok ukur single-threaded menggunakan fitur bahasa semata-mata dari Java klasik (Java 1.0). Jika saya mengkompilasi dan menjalankan menggunakan JDK 1.0, saya akan mendapatkan kinerja yang buruk (karena cos JDK 1.0 tidak memiliki kompiler kode asli). Jika saya beralih dari JDK 1.1 ke ... JDK 1.7, kemungkinan besar saya akan mendapatkan hasil yang semakin baik. Tetapi ini bukan karena perubahan pada bahasa Java ... karena tolok ukur saya menggunakan subset bahasa yang sama. Sebaliknya percepatan disebabkan oleh peningkatan pada kompiler, sistem runtime dan / atau implementasi perpustakaan kelas. Ini semua adalah masalah implementasi .

Poin lainnya adalah bahwa perbedaan implementasi ini bisa sangat signifikan (misalnya urutan besarnya) untuk bahasa yang sama. Jadi fakta bahwa implementasi terbaik untuk bahasa X lebih cepat daripada implementasi terbaik (atau hanya) bahasa Y tidak selalu memberi tahu Anda banyak tentang bahasa itu sendiri.

Stephen C
sumber
Yang terbaik yang dapat Anda lakukan adalah mengukur kinerja program tertentu. Ketika kami mengukur kinerja implementasi bahasa, kami ingin mengetahui berapa lama waktu yang dibutuhkan untuk mengkompilasi beberapa program, bukan berapa lama program itu berjalan.
igouy
Jangka waktu program adalah properti dari program tertentu itu ketika dijalankan menggunakan implementasi bahasa tertentu pada perangkat keras tersebut, dll. Karena waktu program tersebut bukan properti dari bahasa tersebut, adalah amal untuk memungkinkan bahwa dalam konteks ini nama bahasa sedang digunakan sebagai singkatan untuk implementasi bahasa yang biasa dikenal.
igouy
@igouy - itu benar. Tetapi banyak orang tidak membuat perbedaan, seperti yang diilustrasikan oleh banyak situs web lama yang menyatakan bahwa "Jawa lambat. Sayangnya, omong kosong ini dibaca secara harfiah oleh seluruh generasi programmer ... dan itu secara signifikan merusak reputasi Jawa. itulah sebabnya saya membuat poin ini DI SINI.
Stephen C
Karena Anda ingin memiliki kebebasan untuk mengatakan - "ukuran (tidak langsung) dari implementasi bahasa" - tolong jelaskan mengapa orang lain tidak boleh bebas untuk mengatakan - ukuran (tidak langsung) dari suatu bahasa .
igouy
@igouy - 1) Anda bebas untuk mengatakan apa yang Anda suka. Tapi itu tidak membuatmu benar. 2) Pertimbangkan kasus di mana satu-satunya implementasi bahasa adalah omong kosong. Kami membandingkannya. Kemudian kami memperbarui implementasinya, membandingkannya, dan kinerjanya telah meningkat secara dramatis. Apakah itu berarti kinerja bahasa telah meningkat? Bagaimana itu masuk akal ... mengingat bahasanya TIDAK berubah !!!
Stephen C
6

Jika Anda melihat bahasa hanya pada kecepatan eksekusi, Anda kehilangan beberapa poin utama. Kecepatan adalah hal yang baik, tetapi bukan satu-satunya hal.

Haskell menggunakan sistem tipe yang sangat kuat untuk membuat program yang jauh lebih besar kemungkinannya bebas bug dan kuat.

Erlang menggunakan sistem pemantauan bawaannya untuk memungkinkan Anda membuat sistem kesalahan yang dapat memberi Anda tingkat keandalan yang sangat besar dalam menghadapi berbagai jenis kesalahan. Selain itu Erlang dapat memberi Anda tingkat konkurensi yang sulit dicocokkan dengan bahasa lain.

Sebenarnya saya akan menganggap kecepatan eksekusi di zaman modern ini agak jauh di bawah daftar apa yang akan saya pertimbangkan dalam banyak kasus. (OK jika saya melakukan perhitungan numerik besar saya mungkin ingin menggunakan fortran untuk kecepatan tetapi selain itu tidak cukup penting untuk masalah)

Zachary K
sumber