Aplikasi Android ditafsirkan alih-alih dikompilasi. Apakah ini membuatnya lebih lambat dari aplikasi iOS saat runtime?
applications
ios
Armon Safai
sumber
sumber
Jawaban:
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.
sumber
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.)
sumber
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.
sumber