Apakah aplikasi iOS lebih cepat dari aplikasi Android karena aplikasi Android ditafsirkan?

31

Aplikasi Android ditafsirkan alih-alih dikompilasi. Apakah ini membuatnya lebih lambat dari aplikasi iOS saat runtime?

Armon Safai
sumber
14
Ini bukan pertanyaan yang bagus karena aplikasi Android tidak ditafsirkan, seperti yang benar jawaban yang benar-benar menunjukkan.
Aaronaught
2
Biasanya jawaban yang diterima bukan jawaban terbaik tidak terlalu menjadi masalah, karena tujuannya adalah untuk membantu siapa pun yang mengajukan pertanyaan (lihat posting meta ini ). Tapi ini kasus yang cukup ekstrim @ArmonSafai Jawaban yang Anda pilih benar penuh dengan informasi yang salah, dan sudah melewati titik diselamatkan dengan pengeditan. Silakan pertimbangkan memilih jawaban lain.
Selali Adobor
Perhatikan bahwa beberapa perusahaan besar - termasuk IBM - sedang menulis aplikasi utama di Jawa hari ini. Diberikan kompiler Just-In-Time (JIT), yang merupakan bagian standar dari VM Java modern, kinerjanya benar-benar sebanding dengan bahasa tingkat tinggi lainnya. Java bukan hanya "bahasa yang ditafsirkan" selama bertahun-tahun.
keshlam
Kompiler JIT tidak terikat dengan konsep JVM sama sekali. Ada JVM yang tidak menggunakan kompiler JIT, bahkan yang komersial. Beberapa variasi JVM IBM tidak mengaktifkan JIT secara default, sebagai gantinya default ke kompilasi AOT. Juga, catatan kecil, "aplikasi utama di Jawa hari ini" mungkin sedikit lebih tepat satu setengah dekade yang lalu (IBM menambah ke Jawa sebelum 1997)
Selali Adobor
Pertanyaannya agak menyesatkan. Aplikasi iOS "asli" ditulis dalam Objective-C (atau Swift) dan dikompilasi, sedangkan aplikasi Android "standar" ditulis dalam Java dan dikompilasi ke bytecode. Lihat jawaban @ DanHulme. Tetapi dimungkinkan untuk menulis aplikasi untuk platform apa pun dalam HTML & JavaScript menggunakan misalnya PhoneGap / Cordova. Aplikasi HTML biasanya dianggap berjalan lebih lambat daripada aplikasi asli pada platform yang sama. Jadi, jika aplikasi serupa untuk platform "lain" tampaknya lebih lambat, mungkin karena itu dibuat menggunakan teknologi yang berbeda.
David

Jawaban:

85

Java tidak ditafsirkan di Android. Aplikasi Android dikompilasi untuk bytecode oleh pengembang. Bytecode adalah representasi ringkas dari program: lebih kecil dari kode sumber yang ditulis oleh programmer, tetapi masih belum dapat dieksekusi secara langsung oleh CPU. Beberapa optimisasi, seperti penghapusan kode mati, dapat dilakukan pada tahap ini.

Ketika Anda memuat aplikasi pada perangkat, JVM Dalvik mengkompilasi bytecode ke kode yang dapat dieksekusi asli, sama seperti itu akan dijalankan. Ini adalah kompilasi tepat waktu . Ini menyebabkan perlambatan singkat saat program menunggu untuk dikompilasi, tetapi setelah itu tidak ada overhead kinerja, karena kode telah dikompilasi ke kode yang dapat dieksekusi asli.

Ada beberapa keuntungan kinerja untuk melakukannya dengan cara ini daripada kompilasi di muka di komputer pengembang. Aplikasi ini dapat dikompilasi untuk CPU tertentu di ponsel, memanfaatkan fitur perangkat kerasnya dan menggunakan karakteristik kinerjanya. Misalnya, ia dapat menggunakan operasi titik-mengambang perangkat keras jika CPU mendukungnya. Selain itu, kompiler JIT yang cerdik (memang, Dalvik tidak sepintar ini) dapat memonitor cara program berjalan, dan melakukan optimasi berdasarkan cara program digunakan dalam penggunaan nyata. Mungkin mengkompilasi ulang kode dengan petunjuk cabang yang lebih baik setelah melihat opsi mana yang dihidupkan dan dimatikan di lingkungan Anda, di ponsel Anda. Kompiler di muka tidak memiliki informasi ini untuk digunakan.

Dalvik menggunakan cache Dalvik dan teknik lain untuk mengurangi kelemahan kompilasi JIT. JVM baru untuk Android L dan kemudian, ART, menggantikan JIT sepenuhnya dengan depan-of-waktu compiler. Ini mengkompilasi bytecode ke kode yang dapat dieksekusi asli ketika aplikasi diinstal, untuk mendapatkan sebagian besar keuntungan dari JIT tanpa penundaan memuat aplikasi.

Jangan lupa bahwa aplikasi Android tidak sepenuhnya terdiri dari Java. Pengembang memiliki NDK untuk menulis semua atau sebagian dari aplikasi mereka dalam C atau C ++, untuk bagian-bagian penting dari aplikasi, terutama untuk game. Antarmuka tujuan khusus seperti OpenGL dan Renderscript memungkinkan pemrogram memanfaatkan perangkat keras khusus seperti GPU dan SIMD prosesor untuk beberapa jenis komputasi.

Jadi sungguh, tidak ada jawaban sederhana untuk pertanyaan Anda. Menggunakan JIT daripada kompilasi di muka membuat beberapa hal lebih cepat, beberapa hal lebih lambat. Itu hanya satu bagian dari keseluruhan kinerja OS.

Dan Hulme
sumber
1
+1 untuk penjelasan yang bagus. Saya sebenarnya menunggu jawaban seperti ini.
MANI
5
Tidak jauh berbeda dengan debat lama ".NET / Java vs. C ++ performance" di PC, sungguh. Ini apel dan jeruk.
Aaronaught
1
@ArmonSafai Cukup.
Dan Hulme
2
@MTilsted: Itu agak benar, tetapi hampir semua cache, jadi apa yang Anda bicarakan kemungkinan hanya terjadi pertama kali Anda menjalankan aplikasi.
Aaronaught
1
Masalah utama di sini adalah Dalvik sedang sebagai JVM "normal". Antara berbasis register, berbeda dengan stack berbasis seperti HotSpot (karena sifat prosesor ARM vs HotSpot yang menargetkan [seperti IA32]), itu menggunakan Zygote, dan konsep file odex (yaitu seluruh gagasan tidak [kurang lebih] langsung dari file kelas ke loader kelas), memperlakukan Dalvik sebagai JVM normal pasti akan menyebabkan beberapa kesalahpahaman. Terutama karena banyak detail implementasi HotSpot sering dikaitkan dengan JVM secara umum (seperti kompiler JIT).
Selali Adobor
2

Karena ini adalah pertanyaan luas, inilah jawaban luas.

"Apakah aplikasi iOS lebih cepat dari aplikasi Android karena aplikasi Android ditafsirkan?"

Aplikasi iOS pertama tidak lebih "cepat dari" aplikasi Android.

Kedua, tentang masalah "Aplikasi Android diartikan." Ini adalah sesuatu yang akan Anda katakan tentang komputasi, seperti "15 tahun yang lalu": ​​seperti yang dapat Anda lihat dari diskusi di atas, situasinya jauh lebih rumit hari ini; sepenuhnya teknologi baru telah mengemuka. Konsep "dikompilasi lebih cepat daripada ditafsirkan!" relevan membandingkan, Anda tahu, perl kode mesin 20 tahun yang lalu; banyak hal telah bergerak begitu banyak sehingga masalah tidak dapat benar-benar diterapkan ke "iOS V Android" hari ini.

Ketiga, ada masalah lain dalam pemrograman seluler yang benar-benar membanjiri pertimbangan tersebut. Hanya satu contoh di lapangan, pemrogram seluler menjatuhkan diri karena menangani daftar gambar yang besar, pemuatan yang malas, dan masalah serupa. Bagaimana kedua OS, dan berbagai pustaka populer, menangani masalah-masalah kritis ini sering mengubah-ubah masalah lainnya.

Keempat, satu lagi masalah besar pada ponsel adalah masalah chipset grafis dan berbagai hubungan rumit dengan perangkat lunak, OpenGL, dan sebagainya. Sebagai contoh, Apple keluar dengan sistem yang mereka sebut "Logam" dalam kaitannya dengan masalah ini, dan Android keluar dengan "benda" mereka sendiri di bidang ini. Masalah-masalah di sekitar jalur pipa grafis ini sangat penting untuk bagaimana aplikasi "rasakan" di tangan Anda.

Jawaban yang sangat singkat untuk pertanyaan Anda adalah "dikompilasi V. diartikan" pada dasarnya adalah titik diskusi kedaluwarsa lho?

(Juga, saya tidak secara khusus menemukan Note3 "lebih lambat" dari iPhone. Juga, beberapa di antaranya adalah artefak murni - memang ada ponsel Android murah: tidak ada iPhone berkinerja rendah yang dibuat, sehingga beberapa orang mungkin salah ide dari ini.)

Fattie
sumber
-3

Karena aplikasi yang ditafsirkan tidak berarti selalu lambat. Terkadang mereka lebih kuat dan dinamis dibandingkan dengan yang dikompilasi. Karena semua kode dalam aplikasi yang dikompilasi dikompilasi sekali & output disimpan dalam bentuk pustaka atau file yang dapat dieksekusi, sementara dalam bahasa yang diinterpretasikan, satu kali dapat secara acak mengubah urutan eksekusi. Jadi bisa saya katakan, itu tergantung pengembang ke pengembang dan ada cara pemrograman.

Namun, Java (bahasa pemrograman Android) tidak ditafsirkan tetapi dikompilasi JIT. Itu berarti bahwa program Android dikompilasi sesaat sebelum Anda menjalankannya, memberikan kinerja yang mirip dengan Objective C. iOS

Baru-baru ini, kerangka ART Android melakukan pra-kompilasi aplikasi, sehingga dijalankan dengan cara yang sama seperti aplikasi iOS. Dengan kata lain, versi Android berikutnya mungkin akan secepat iOS.

Memperbarui

Bahasa pemrograman umumnya termasuk dalam salah satu dari dua kategori: Dikompilasi atau Diartikan. Dengan bahasa yang dikompilasi, kode yang Anda masukkan dikurangi menjadi seperangkat instruksi khusus mesin sebelum disimpan sebagai file yang dapat dieksekusi. Dengan bahasa yang diterjemahkan, kode disimpan dalam format yang sama seperti yang Anda masukkan. Program yang dikompilasi umumnya berjalan lebih cepat daripada yang ditafsirkan karena program yang ditafsirkan harus dikurangi menjadi instruksi mesin saat runtime. Namun, dengan bahasa yang ditafsirkan Anda dapat melakukan hal-hal yang tidak dapat dilakukan dalam bahasa yang dikompilasi. Misalnya, program yang ditafsirkan dapat memodifikasi diri mereka sendiri dengan menambahkan atau mengubah fungsi saat runtime. Biasanya juga lebih mudah untuk mengembangkan aplikasi dalam lingkungan yang ditafsirkan karena Anda tidak perlu mengkompilasi ulang aplikasi Anda setiap kali Anda ingin menguji bagian kecil.

Lihat-Tajam
sumber
1
apa yang Anda maksudkan "sekali dapat mengubah urutan eksekusi secara acak? Dan bagaimana mereka lebih kuat dan dinamis? Juga saya tidak mengatakan bahwa mereka lambat, hanya saja mereka lebih lambat, bahkan sedikit.
Armon Safai
3
Ini tidak sepenuhnya benar. Adalah menyesatkan untuk mengatakan bahwa tidak harus mengkompilasi ulang adalah keuntungan, karena Anda masih perlu membuat file APK dan menyebarkannya ke perangkat uji. Google tidak memutuskan untuk menggunakan Java: Android sudah berbasis Java sebelum Google membelinya. File APK tidak mengandung kode "dalam format yang sama dengan yang [programmer] masukkan."
Dan Hulme
1
Microsoft .NET dikompilasi ke kode IL yang juga ditafsirkan seperti java dikompilasi ke bytecode.
Esben Skov Pedersen
12
Banyak informasi dalam jawaban ini benar-benar tidak relevan atau secara teknis tidak benar. Saya jujur ​​menyarankan jawaban ini benar-benar direvisi untuk akurasi teknis.
Aza
2
Java umumnya bukan bahasa yang ditafsirkan , kecuali jika Anda berurusan dengan implementasi JVM yang tidak biasa. Kompilasi JIT bukan hal yang sama dengan juru bahasa, jadi sebagian besar jawaban ini sejujurnya tidak relevan dalam konteks kinerja Android karena menggunakan JIT.
eldarerathis