Saya telah berkali-kali melihat berbagai tolok ukur yang menunjukkan bagaimana sekelompok bahasa melakukan tugas yang diberikan.
Tolok ukur ini selalu mengungkapkan bahwa Python lebih lambat dari Java, dan lebih cepat dari PHP, dan saya bertanya-tanya mengapa demikian.
- Java, Python, dan PHP dijalankan di dalam mesin virtual
- Ketiga bahasa mengonversi program mereka menjadi kode byte khusus yang berjalan di atas OS - jadi tidak ada yang berjalan secara native
- Baik Java dan Python dapat "dikompilasi" (
.pyc
untuk Python) tetapi__main__
modul untuk Python tidak dikompilasi
Python dan PHP diketik secara dinamis, dan Java secara statis - apakah ini alasan Java lebih cepat, dan jika demikian, tolong jelaskan bagaimana hal itu mempengaruhi kecepatan.
Dan, bahkan jika argumen dinamis-vs-statis benar, ini tidak menjelaskan mengapa PHP lebih lambat dari Python - karena keduanya adalah bahasa yang dinamis.
Anda dapat melihat beberapa tolok ukur di sini dan di sini , dan di sini
java
php
python
language-design
treecoder
sumber
sumber
Jawaban:
Kode JVM dapat dikompilasi dengan JIT secara efisien, menggunakan kompiler ad hoc yang sepele (dan cepat). Tetapi hal yang sama akan sangat sulit untuk PHP dan Python, karena sifat mereka yang diketik secara dinamis. JVM diterjemahkan ke tingkat asli yang cukup rendah dan kode asli, sangat mirip dengan apa yang dihasilkan kompiler C ++, tetapi untuk bahasa dinamis Anda harus menghasilkan pengiriman dinamis untuk semua operasi dasar dan untuk semua pemanggilan metode. Pengiriman dinamis ini adalah hambatan utama untuk semua bahasa semacam ini.
Dalam beberapa kasus dimungkinkan untuk menghilangkan pengiriman dinamis (serta panggilan virtual di Jawa) menggunakan kompiler JIT tracing jauh lebih rumit. Pendekatan ini masih dalam tahap awal, tidak melakukan terlalu banyak interpretasi abstrak, dan kompiler seperti itu kemungkinan akan tersedak
eval
panggilan (yang sangat khas untuk bahasa dinamis).Adapun perbedaan antara Python dan PHP, yang terakhir hanya kualitas yang jauh lebih rendah. Secara teori bisa berjalan lebih cepat, tetapi tidak akan pernah.
sumber
eval
panggilan.Ada masalah umum dengan pertanyaan ini karena terlalu absolut. Tidak masuk akal untuk mengatakan "bahasa X lebih cepat dari bahasa Y". Bahasa komputer itu sendiri tidak "cepat" atau "lambat" karena itu hanya cara mengekspresikan suatu algoritma. Pertanyaan aktual seharusnya ada pada urutan "mengapa implementasi X1 bahasa X lebih cepat dari implementasi Y1 bahasa Y untuk domain masalah khusus ini?"
Beberapa perbedaan kecepatan pasti akan keluar dari bahasa itu sendiri karena bahasa tertentu lebih mudah untuk mengimplementasikan domain tertentu daripada yang lain. Tetapi banyak dari apa yang membuat implementasi cepat bukan bahasa. Misalnya, Anda tidak bisa mengatakan "Python lebih lambat dari Java" tanpa mempertimbangkan apakah Anda berbicara tentang CPython, IronPython, atau PyPy. Hal ini terutama berlaku untuk bahasa yang menggunakan VM karena kecepatannya akan langsung dipengaruhi oleh kualitas VM.
Selain itu, saya bekerja dengan sistem yang karena berbagai alasan tidak dapat menggunakan JIT pada perangkat kami dengan JavaScript VM yang sangat populer yang biasanya mendukungnya. Ini berarti bahwa JavaScript kami berjalan jauh, jauh lebih lambat daripada di PC dengan prosesor yang sama. Satu perubahan itu, yang tidak terkait langsung dengan bahasa itu sendiri, menjadikan JavaScript dari "beberapa kali lebih lambat daripada C ++" menjadi "pesanan dengan magnitudo lebih lambat dari pada C ++" untuk tugas-tugas yang kita pedulikan.
Juga pertimbangkan adalah bahwa bahasa berbeda dalam karakteristik kinerja dengan cara yang tidak dapat dibandingkan secara langsung. Terlalu banyak tolok ukur hanya menerjemahkan program dari bahasa A ke bahasa B dan tidak memperhitungkan bahwa bahasa berbeda dalam fitur apa yang cepat. (Anda dapat melihat ini dalam perbandingan tolok ukur yang masuk akal seperti yang Anda tautkan karena mereka sering memiliki catatan seperti "terima kasih kepada anu-anu karena menunjukkan kepada saya bagaimana menerapkannya dalam bahasa Foo.)
Misalnya, Ambil kode Java ini:
Akan tergoda untuk "menulis ulang" ini dalam C ++ dan membandingkan run time:
Masalahnya, setiap programmer C ++ yang kompeten akan segera melihat bahwa di C ++, ini bukan cara tercepat untuk melakukan sesuatu. Anda dapat dengan mudah mempercepat dengan mengubahnya agar lebih sesuai dengan C ++:
Intinya bukan bahwa C ++ bisa cepat tetapi daripada menulis tolok ukur untuk membandingkan bahasa benar-benar sulit. Untuk melakukannya dengan tepat, Anda harus menjadi ahli dalam kedua bahasa, dan menulis dari awal dalam kedua bahasa. Bahkan kemudian, Anda dapat dengan mudah lari ke area di mana satu bahasa unggul dalam tugas tertentu. Sebagai contoh, saya dapat menulis versi Towers of Hanoi di C ++ yang akan berjalan lebih cepat dari Java pada kompiler yang masuk akal. Saya bisa melakukannya dengan cara curang, menggunakan templat C ++, dievaluasi pada waktu kompilasi (http://forums.devshed.com/c-programming-42/c-towers-of-hanoi-using-templates-424148.html)
Intinya tidak ada yang bisa saya katakan bahwa "C ++ lebih cepat daripada Java" karena program saya kembali secara instan sementara versi Java berjalan selama beberapa menit (dan berharap tidak ada yang memperhatikan program saya membutuhkan waktu setengah jam untuk membangun.) Intinya adalah bahwa untuk ini bervariasi kasus sempit, C ++ lebih cepat. Untuk kasus sempit lainnya, mungkin sebaliknya. Jadi itu bukan "C ++ lebih cepat", itu "C ++ lebih cepat dalam kasus di mana Anda dapat mengevaluasi ekspresi saat membangun menggunakan templat." Kurang memuaskan, tetapi benar.
Perbedaan kecepatan dalam bahasa sebagian besar tentang implementasi. Bahasa yang dikompilasi akan lebih cepat daripada bahasa yang ditafsirkan. Kompilasi ke kode asli akan lebih cepat daripada kompilasi ke kode byte. Ini akan memiliki lebih banyak efek daripada pertanyaan seperti apakah bahasa diketik secara statis atau tidak. Dan tentu saja, implementasi yang baik akan lebih cepat daripada yang buruk.
Dan jangan lupa bahwa programmer yang baik akan menghasilkan kode yang lebih cepat daripada programmer yang buruk, seringkali sampai pada taraf yang jauh melebihi perbedaan bahasa.
sumber
Ini berkaitan dengan kualitas kompiler, kompiler java telah terus dioptimalkan lebih lama, dan optimasi lebih penting karena semua kode dikompilasi untuk Java. Saya tidak yakin alasan pasti mengapa python lebih cepat dari PHP, tapi saya berani bertaruh ini karena pengaruh Google dengan Python.
sumber
Mengapa Java adalah yang tercepat:
Ketikan + JIT kompilasi secara statis + --server flag untuk secara agresif mengkompilasi ulang kode yang sedang berjalan.
Mengapa Python lebih cepat dari PHP:
Python mungkin merupakan bahasa yang dinamis, tetapi masih diketik dengan kuat. Ini berarti bahwa struktur kode Anda mampu optimasi runtime.
Mengapa PHP payah:
Ini pada dasarnya javascript di server (tidak ada dukungan multithreading, benar-benar dinamis, diketik longgar).
Intinya, semakin banyak kompiler tahu tentang kode Anda, semakin banyak yang bisa dioptimalkan. Java sepenuhnya dapat dioptimalkan sebelum dijalankan, dan saat sedang berjalan. Python dapat dioptimalkan saat sedang berjalan, dan PHP, yah, mengerikan. Facebook benar-benar mentranspilasikan PHP mereka ke C sebelum sampai di server.
https://developers.facebook.com/blog/post/2010/02/02/hiphop-for-php--move-fast/
sumber
Tolok ukurnya agak condong mendukung pemrograman matematika yang berat.
Tidak mengherankan bahwa Python cukup bagus dalam matematika yang rumit jika Anda mempertimbangkan di mana dan mengapa itu pertama kali ditulis .
PHP di sisi lain ditulis untuk melayani halaman web, ia dapat melakukan hal-hal lain tetapi halaman web adalah yang terbaik dan setara atau lebih baik daripada Java pada tugas ini.
sumber