Apakah Android atau Java menggunakan lebih banyak daya karena itu berjalan pada mesin virtual?

14

Karena aplikasi Android berjalan pada JVM (Dalvik VM) yang pada dasarnya adalah prosesor virtual, dan setiap instruksi virtual harus dipetakan dengan instruksi asli chipset yang mendasarinya, apakah pemetaan ini menghasilkan konsumsi daya yang lebih besar karena overhead pemetaan ini?

Pertanyaan ini dapat diperluas ke Java dan juga diucapkan sebagai "apakah aplikasi Java menggunakan lebih banyak daya?". Apakah ini sebabnya ponsel Android memiliki daya tahan baterai yang mengerikan dibandingkan dengan platform / ponsel lain?

Sunting : Berdasarkan jawaban saya telah mengklarifikasi beberapa poin karena saya telah salah berbicara tentang JVM dan Dalvik secara bergantian. Dalam bagian ini saya berbicara tentang Jawa hanya untuk menanyakan apakah ia menggunakan lebih banyak daya dan jika ya, apakah itu secara konseptual berlaku untuk Android juga dan apakah hal itu menghasilkan daya tahan baterai yang lebih rendah.

Konteks : dikutip dari Wikipedia:

  1. Java bytecode analog dengan bahasa assembly untuk kode C.
  2. Dari sudut pandang kompiler, mesin virtual Java hanyalah prosesor lain dengan set instruksi, Java bytecode, yang kodenya dapat dihasilkan.
  3. JVM memiliki arsitektur stack. Dalvik adalah mesin virtual proses yang bukan jenis virtualisasi yang sama dengan JVM dan memiliki arsitektur register.

Karena bahasa pemrograman Java dikompilasi ke bytecode (seperti assembly) dan dijalankan pada prosesor virtual, ia menyediakan portabilitas kode perangkat lunak yang sebenarnya. Juga, karena ada JVM untuk Linux dan Linux telah porting ke perangkat keras yang terbuka, kombinasi tersebut dapat memberikan portabilitas aplikasi yang sebenarnya di seluruh tumpukan.

Daya : Pertanyaan pada dasarnya bermuara pada hal ini - untuk serangkaian fungsi yang sama dari kode perangkat lunak atau aplikasi Anda, berapa persen dari siklus jam CPU Anda dikaitkan dengan lingkungan run time. Ini dengan lingkungan kompilasi Just-In-Time dari JVM modern di mana jika bytecode dikompilasi dengan instruksi asli chipset yang mendasarinya, maka run-time hanya akan aktif selama kompilasi jit. Jadi berapa banyak lagi siklus clock CPU yang digunakan dalam memiliki lingkungan run-time yang diharapkan menghasilkan overhead konsumsi daya. Saya hanya tertarik pada aspek konsumsi daya, dan bukan kinerja relatif dibandingkan dengan bahasa yang diketik dan dibangun secara statis dan memahami keunggulan Jawa. Sub-pertanyaan yang mungkin terkait:

  • Apakah waktu Java Run menggunakan libc untuk fungsionalitasnya?
  • Apakah ada dari titik-titik terkait konsumsi daya ini yang diterjemahkan ke VM Dalvik dan Android?
  • Alih-alih menggeneralisasi konsumsi baterai Android yang buruk tanpa membicarakan layar dan chipset nirkabel - mari kita bahas bagaimana iPhone 5 memiliki baterai 1440 mAH yang sangat kecil dibandingkan dengan ponsel Nexus modern. Seluruh rangkaian pemikiran ini (Java, prosesor Virtual, pemetaan instruksi, Android) muncul karena seorang teman setia-iphone mengklaim ini bisa menjadi alasan kemungkinan iphone-nya memiliki daya tahan baterai yang lebih baik daripada nexus (mengagumkan) saya.

Bagaimanapun, terima kasih atas jawaban di bawah ini.

PKM
sumber
1
Jangan membandingkan baterai dengan mAh mereka. Itu saat ini; secara teori Anda bisa memiliki baterai 2 mAh dengan daya lebih besar (watt-jam) daripada baterai dengan 10000000 mAh. Tergantung tegangannya. Nexus 4 memiliki baterai 8 Wh sedangkan iPhone 5 memiliki baterai Wh 5,45. Perbedaannya sebagian besar disebabkan oleh ukuran layar: Nexus 4 memiliki layar diagonal 4,7 "sedangkan iPhone 5 memiliki layar 4 inci, dengan resolusi lebih tinggi dan kecerahan lebih tinggi (608 cd / m ^ 2 vs 500). Prosesornya adalah juga sangat berbeda: Nexus 4 memiliki quad-core @ 1,5 GHz; iPhone 5 memiliki dual core @ 1,3 GHz. Lebih cepat = lebih banyak menggunakan baterai.
allquixotic
1
Pada dasarnya iPhone bertahan lebih lama dengan baterai yang lebih kecil karena seluruh platform dirancang untuk menjadi lebih kecil: lebih sedikit ruang fisik, layar lebih kecil, CPU lebih kecil, core lebih sedikit, lebih sedikit kemampuan, lebih sedikit kinerja, lebih sedikit, lebih sedikit, lebih sedikit. Ponsel Android telah menjadi tren sebaliknya: lebih besar, dan lebih banyak inti, dan lebih banyak daya, dan lebih cepat. Tentu saja mereka akan membutuhkan baterai yang jauh lebih besar untuk mendapatkan daya tahan baterai yang sama. Terkadang bahkan baterai yang besar tidak mengkompensasi konsumsi dengan benar, dan dalam hal ini Anda memiliki ponsel dengan masa pakai baterai yang buruk.
allquixotic

Jawaban:

25

Pertanyaan Anda didasarkan pada banyak asumsi yang salah. Biarkan saya mencoba menjernihkannya:

  • Anda mengatakan "JVM (Dalvik VM)". Itu seperti mengatakan "Pesawat (Sepeda)". Kedua hal ini sama sekali tidak ada hubungannya satu sama lain.

  • Anda mengatakan "... yang pada dasarnya adalah prosesor virtual". Cukup salah. Hal ini tidak terjadi bahwa, setiap kali kata-kata "Virtual Machine" atau akronim "VM" digunakan dalam konteks teknis, bahwa pada dasarnya setara dengan VMware Workstation . Ini karena produk seperti VMware memang meniru seluruh komputer, tidak hanya CPU, dan menjalankan sistem operasi di atas sistem operasi lain. Dalvik VM tidak berfungsi seperti itu. Bahkan tidak dekat.

  • Java hanyalah bahasa pemrograman. Itu sintaks. Program Android / Dalvik menggunakan sintaks yang sama atau sangat mirip dengan bahasa pemrograman desktop / server yang sama sekali tidak terkait yang disebut Java, yang berjalan pada Java Virtual Machine. Secara teori, Anda bisa menulis kode Java yang kecepatannya hampir sama dengan kode C, karena keduanya bahasa pemrograman tingkat tinggi. Iblis ada dalam rincian implementasi panggilan perpustakaan dan cara runtime dirancang, yang sangat sedikit hubungannya dengan sintaks bahasa.

  • Ini adalah generalisasi berlebihan untuk mengatakan bahwa Dalvik VM, Sun Java Hotspot JVM, atau sintaksis bahasa pemrograman Java bertanggung jawab atas konsumsi daya yang tinggi. Alasannya adalah bahwa Anda harus membandingkan apa pun yang Anda bicarakan dengan kinerja sesuatu yang lain . Dalam kasus yang paling umum, ketika Anda hanya membandingkan kemampuan "kasus terbaik" dari kedua platform, pada prinsipnya memungkinkan untuk membuat aplikasi Dalvik yang sama cepat, atau lebih cepat, daripada program pada platform lain. Selain manajemen memori otomatis dan kompilasi JIT - fitur yang standar di hampir semua lingkungan pemrograman hari ini, termasuk di iOS dan JavaScript / HTML5 - ada sangat sedikit yang memisahkan Dalvik dari Objective-C, .NET, Ruby, Oracle Hotspot JVM, Python, dan sebagainya.

  • Persepsi bahwa "Java lambat" disebabkan oleh masalah dengan versi Java yang lama, karena mereka tidak memiliki Just-In-Time Compiler (JIT), atau JIT yang mereka miliki sangat terbatas fungsinya. JVM telah memiliki Just-In Time Compileruntuk waktu yang sangat lama sekarang. Kompiler JIT adalah bagian dari runtime (misalnya, JVM) yang menggunakan bytecode yang tidak tergantung prosesor - misalnya Java bytecode - dan mengkompilasinya menjadi instruksi asli untuk CPU. Proses ini dilakukan ketika program Java diluncurkan, dan kompiler JIT tingkat lanjut dapat mengoptimalkan fungsi atau instruksi individu pada saat runtime untuk meningkatkan kinerjanya berdasarkan hasil yang diamati. Sebagai contoh, jika suatu metode mengembalikan true setiap kali dipanggil, tetapi tidak jelas dari bytecode asli bahwa ia akan melakukannya, kompiler JIT dapat mengenali bahwa itu hanya mengembalikan true, dan mengganti pemanggilan fungsi dengan hard- nilai kode "benar". Ini hanya satu contoh.

  • Kompilasi JIT dan teknik analisis kode dinamis runtime telah membuat kemajuan besar dalam beberapa tahun terakhir. Banyak di komunitas ilmu komputer percaya bahwa, dalam satu atau dua dekade lagi, analisis canggih tersedia dalam bahasa yang ditafsirkan secara dinamis / dikompilasi, seperti Java, C # dan Ruby, akan sangat maju sehingga, dalam kebanyakan kasus, bahasa ini akan dieksekusi lebih cepat pada runtime daripada bahasa yang dikompilasi secara statis seperti C dan C ++. Itu karena kompiler statis biasanya terbatas pada mengkompilasi kode saat build-time, dan kode tersebut tidak dimodifikasi saat runtime. Tetapi dalam lingkungan runtime di mana kode program dapat menulis ulang sendiriselama eksekusi untuk melakukan lebih efisien, ada sejumlah besar sisi positif yang dapat dicapai dengan menganalisis kinerja kode dan membuat penyesuaian untuk mengurangi kompleksitas kode atau jumlah instruksi yang dijalankan pada CPU. Untuk kode yang sering disebut, investasi waktu yang diperlukan untuk melakukan analisis jauh melebihi manfaat kinerja berulang kali memanggil kode lebih cepat.

  • Perlu dicatat bahwa Android Dalvik VM juga mengandung JIT, dan itu tidak menggunakan format bytecode yang sama dengan Sun / Oracle JVM. JIT Dalvik dioptimalkan untuk lingkungan memori rendah, dan sangat canggih sejauh peningkatan kinerja runtime. Jadi agak kebetulan bahwa JVM dan Dalvik menerapkan optimasi yang sama untuk masing-masing lingkungan runtime berbasis Java, tetapi di bawah tenda mereka sangat berbeda.

  • Jangan lupa bahwa Dalvik itu sendiri; kernel Linux; proses sistem tingkat rendah; dan inti dari browser web Android (baik Firefox maupun Chrome) ditulis dalam bahasa C / C ++ asli, dan karenanya mereka tidak memiliki masalah overhead seperti yang akan dilakukan oleh program Dalvik. Ini sama dengan iOS. Jika Anda berbicara tentang Android murni dan bukan mengasapi carrier / pihak ketiga yang duduk di atasnya, sebagian besar yang terdiri dari inti Android tidak ditulis menggunakan Dalvik.

  • Pengembang aplikasi di Android juga dapat, sesuai pilihan mereka, menulis kode asli, melewati Dalvik. Jika seorang pengembang aplikasi merasa bahwa Dalvik bertindak sebagai penghambat dalam kinerja kode mereka, atau menyebabkannya menghabiskan terlalu banyak baterai, mereka hanya dapat menulis C / C ++ atau bahkan kode perakitan jika mereka memilih, tanpa harus mendapatkan persetujuan Google untuk melakukannya, dan distribusikan aplikasi mereka seperti itu.

Berikut adalah beberapa alasan aktual mengapa perangkat bertenaga baterai Android, atau perangkat apa pun , mungkin memiliki masalah dengan usia baterai:

  • Aplikasi yang membuat CPU, layar, atau koneksi data tetap terjaga. Khususnya, chipset 4G seperti LTE menggunakan banyak energi saat dinyalakan, jadi jika Anda memiliki program latar belakang yang terus menerus membangunkan chip LTE untuk mentransfer beberapa kilobyte data, yang akan menguras baterai Anda dengan sangat cepat. Layar pada smartphone dan tablet modern juga sangat hemat energi, kecuali jika Anda menurunkan kecerahan menjadi minimal.

  • "Bloatware" yang harus ada di perangkat, dan tidak dapat dihapus. Beberapa operator yang tidak bertanggung jawab mengharuskan Anda menjalankan bloatware yang menggunakan siklus CPU dan membuat koneksi data tetap terjaga. Ini bisa disebabkan oleh ketidakmampuan pengembang perangkat lunak bloatware, atau tujuan yang disengaja untuk memantau aktivitas Anda di ponsel cerdas Anda dan mengirimkannya ke server jarak jauh untuk penggalian data, yang sangat hemat energi untuk baterai Anda.

Akhirnya, saya tidak setuju dengan penilaian Anda bahwa Android memiliki masalah masa pakai baterai yang lebih buruk daripada platform seluler lainnya. Ponsel dan perangkat tertentu memang memiliki masalah masa pakai baterai, baik karena kapasitas baterai relatif terhadap konsumsi energi perangkat keras; pengaturan daya yang dioptimalkan dengan buruk (dipilih oleh pengguna, operator, atau pabrikan); atau aplikasi bloatware yang menjaga chip di ponsel tetap aktif sepanjang waktu. Tetapi untuk setiap contoh perangkat yang memiliki masalah baterai, saya dapat memberi Anda contoh tandingan perangkat dengan masa pakai baterai yang sangat baik. Tidak ada cara sederhana untuk menggeneralisasi bahwa "itu Dalvik" atau "itu Linux" atau "itu Java". Optimalisasi daya adalah perangkat keras / lunak yang rumit, yang menjadi perhatian utama, termasuk kinerja, daya tanggap, dan harapan pengguna untuk masa pakai baterai, dengan pro dan kontra untuk setiap pilihan. Untuk benar-benar memahami profil daya suatu perangkat, Anda harus mencermati baterai itu sendiri, semua perangkat keras, dan semua perangkat lunak yang berjalan pada perangkat.

allquixotic
sumber
1
+1 Ini sedikit tl; dr tetapi semuanya, bahkan jawaban teknisnya bagus.
Doktoro Reichard
Terima kasih, semua poin adil. Saya telah salah menggunakan beberapa istilah secara bergantian, karena saya bertanya sesuatu yang saya tidak tahu. Buat beberapa perubahan pada pertanyaan itu sendiri sekarang jika Anda masih tertarik.
PKM
Jawaban ini cukup informatif tetapi jauh dari pertanyaan. Inti dari pertanyaannya adalah apakah overhead VM menggunakan lebih banyak waktu CPU kemudian menghemat dengan optimisasi yang dipekerjakannya. Itu berubah menjadi lebih dari mengapa Android lebih baik daripada iOs meskipun pertanyaan itu juga mengisyaratkan untuk sisi orher.
Igor Čordaš
Ada juga asumsi yang salah di sini. IOS memang tidak memiliki manajemen memori otomatis Mac OS. Dan memang manajemen itulah yang menjadikan Dalvik "Jawa" dengan semua masalah khasnya. Beberapa bulan yang lalu ada gambaran yang cukup bagus tentang masalah Pengumpulan Sampah (GC) yang dimiliki Dalvik: anandtech.com/show/8231/… - jika mereka mempengaruhi masa pakai baterai juga atau hanya kinerja yang tidak dapat saya katakan.
pvblivs
@pvblivs Walaupun benar bahwa menulis "aplikasi tingkat tinggi" untuk iOS menggunakan penghitungan referensi otomatis, bukan GC sedangkan Dalvik menggunakan GC, dan "karena itu" (saya tidak mengatakan ini selalu benar, hanya saja Anda sepertinya berdebat itu, dan setidaknya masuk akal) iOS "lebih efisien" daripada Android ... Anda masih agak kehilangan poin saya bahwa aplikasi Android tidak harus ditulis dalam Java, dan pada kenyataannya dapat ditulis dalam assembler atau bahkan kode ARM asli jika Anda mau! Aplikasi yang sangat peka terhadap kinerja dan barang bawaan harus menggunakan kode asli tanpa GC.
allquixotic
5

Dalam jawaban ini saya akan membandingkan kinerja dengan Android dan iOS karena keduanya mengambil lebih dari 80% pangsa pasar.

Aplikasi Java tidak menggunakan lebih banyak daya. ( http://www.javarants.com/2004/05/04/looks-like-apple-should-switch/ ) Java VM Oracle atau pada kenyataannya Google Dalvik VM dianggap jauh lebih efisien daripada Objective-C iOS. Java dapat mengoptimalkan kode sebelum dijalankan pada telepon yang dapat menghasilkan kinerja yang jauh lebih baik. Perpustakaan Java adalah Open Source dan karenanya telah dioptimalkan oleh ratusan pengembang yang berbeda. Di sisi lain dengan iOS hanya pengembang Apple yang dapat mengubah kode. Kurang ulasan = kurang potensi kinerja.

Program Android juga dapat menjalankan kode C asli yang dapat diperdebatkan lebih cepat daripada lagi Object-C (satu-satunya bahasa yang didukung pada IOS).

Alasan mengapa Google memutuskan untuk menggunakan VM Dalvik adalah untuk portabilitas. Saya tahu empat arsitektur CPU berbeda yang Android dapat jalankan secara resmi (ARM, MIPS, x86, I.MX). Sedangkan setiap OS ponsel lainnya hanya bisa menggunakan satu (ARM). ( http://en.wikipedia.org/wiki/Comparison_of_mobile_operating_systems ) Jadi, membandingkan berbagai jenis CPU dengan IPhone misalnya tidak adil. Jika Android dijalankan pada IPhone, Android akan sebanding dengan kinerja superior dan daya tahan baterai.

"Apakah aplikasi Java menggunakan lebih banyak daya?" Tidak.
Mengapa ponsel Android memiliki daya tahan baterai yang mengerikan dibandingkan dengan platform / ponsel lain? Banyak ponsel Android yang dibuat lebih murah daripada IPhone Apple, tetapi lihat perbedaan harganya. IPhone harganya lebih mahal karena baterai yang jauh lebih besar dengan di dalamnya (dan itu rata-rata lebih lambat CPU). Ponsel android saya (Google Galaxy Nexus) memiliki daya tahan baterai yang sebanding dengan 4G iPhone tetapi memiliki spesifikasi perangkat keras yang jauh lebih cepat (1GHz vs 1.2GHZ).

EDIT: Java dapat mengoptimalkan kode tanpa sepengetahuan programmer. Sempurna, kode C akan selalu berjalan lebih cepat daripada Java / Objective-C / C #; Yang mengatakan, berapa banyak programmer di luar sana yang sempurna? Pada tingkat JVM, Java dan perpustakaan akan selalu "lebih sempurna" karena prinsip pengembangan sumber terbuka. ( http://www.infoq.com/news/2012/03/Defects-Open-Source-Commercial )

EDIT 2: Informasi kecil: Ponsel Android P780 baru Lenovo - 42 jam bicara vs 12 jam menggunakan IPhone.

Mark Lopez
sumber
1
Saya berpendapat bahwa pertanyaan itu sendiri membuat klaim yang sepenuhnya tidak berdasar seperti "... Ponsel Android memiliki daya tahan baterai yang sangat buruk dibandingkan dengan platform / ponsel lain". Sama sekali tidak benar.
allquixotic
Ingin menambahkan bahwa tautan pertama Anda adalah IMHO dengan kualitas yang meragukan: file benchmark hilang, dan seorang komentator membantah pendapat poster tautan tersebut. Posting ini tampaknya bias, karena kurangnya sumber yang tidak dapat disangkal dan pernyataan subjektif.
Doktoro Reichard
Nah komentator pertama agak benar. Tanpa pengujian terperinci, semua jawaban akan bias. Saya setuju bahwa daya tahan baterai ponsel Android cukup buruk tetapi tentu saja bukan karena VM seperti yang disebutkan banyak orang.
Igor Čordaš
Semua informasi ini akan segera kedaluwarsa dengan kedatangan runtime ART di Android.
Mark Lopez
3

Ya, itu berhubungan dengan peningkatan konsumsi daya - lapisan abstraksi akan melakukan itu. Ini juga mengarah pada penurunan kecepatan (sisi berlawanan dari koin yang sama - jika sesuatu memiliki overhead yang lebih besar akan membutuhkan waktu lebih lama untuk melakukan dan dengan demikian menggunakan lebih banyak CPU). Jika saya mengerti benar itu adalah salah satu keuntungan dari apa yang dilakukan NDK - memungkinkan speedup untuk prosesor tertentu dengan menulis kode tertentu.

Yang mengatakan, untuk sebagian besar pekerjaan saya membayangkan overhead "terkait daya" menjalankan VM dikerdilkan oleh pertimbangan lain - untuk sebagian besar program penggunaan layar dan radio akan mengkonsumsi sebagian besar daya.

davidgo
sumber
Kamu benar. AEven menggunakan elemen antarmuka hitam pada layar Oled akan menjadi penghemat daya yang lebih besar kemudian pergi dengan NDK vs SDK dalam banyak kasus.
Igor Čordaš
3

Sehubungan dengan semua poster lain, saya percaya yang paling penting di sini bukanlah apakah C / C ++ / Java ada, tetapi apa yang dilakukan aplikasi.

Karena konsumsi daya memetakan langsung dengan pemrosesan, saya akan bertanya pada diri sendiri pemrosesan apa yang akan dilakukan suatu program.

Katakanlah Anda menambahkan angka. Katakanlah Anda menambahkan 2 dengan 2 pada infinite loop hingga Anda mencapai 2.000.000. Dua pertanyaan muncul:

  1. Bagaimana ini diterapkan: Apakah itu for-loop? Apakah ini loop sementara? (Apakah ini hack Goto / Label?)
  2. Bagaimana kode dioptimalkan.

Kedua pertanyaan ini pada akhirnya menentukan berapa banyak operasi yang perlu dilakukan prosesor dan pada akhirnya, seberapa besar daya yang digunakan perangkat. Karena itu, "overhead" dari menjalankan lingkungan tervirtualisasi mungkin dapat diabaikan karena optimasi yang dilakukan sebelumnya oleh Java pada keseluruhan program, tetapi sekali lagi, itu semua tergantung pada apa yang dilakukan aplikasi.

Doktoro Reichard
sumber
0

Iya.

Mesin virtual 'melakukan semuanya dua kali', dan belum tentu efisien. Jadi, mereka akan menggunakan kekuatan setidaknya dua kali lipat untuk memproses instruksi yang sama dengan 'mesin asli'. Kehadiran mesin virtual memperlambat segalanya dan menggunakan lebih banyak daya. Pada dasarnya, OS seperti iOS dan WIndows akan melakukan segalanya lebih cepat dan dengan konsumsi daya yang lebih sedikit.

Ini berarti perbedaan nyata dalam transisi layar, pemuatan halaman, navigasi, hal-hal seperti itu. Saat ini saya membandingkan Android (VM) dan Windows Phone, dan bahkan dengan prosesor yang lebih lambat (1GHz vs 1.6GHz), Windows secara signifikan mengungguli Android melakukan tugas yang sama.

Namun, apa yang menarik perhatian kebanyakan orang adalah ketika mereka menginstal aplikasi dan tiba-tiba baterai mereka semakin cepat habis. Itu bukan karena mesin virtual, tetapi aplikasi yang menggunakan sumber daya dengan lapar.

Seluruh alasan untuk OS mesin virtual, portabilitas, bukan alasan yang baik untuk mendasarkan OS. Apakah Anda melihat orang membeli ponsel dengan arsitektur favorit mereka dan menggunakan Android karena sifatnya yang portabel? Apakah Anda melihat orang-orang memberikan kinerja dan keandalan yang lebih tinggi dan menempatkan Android di ponsel non-android mereka? Orang-orang membeli Telepon Android, atau Telepon Windows, atau iPhone, dll. Mengorbankan kinerja untuk portabilitas dalam perangkat berbiaya rendah tidak praktis. Itu adalah ide bagus yang menjadi gagal.


sumber