Android veya Java, sanal bir makinede çalıştığı için daha fazla güç kullanıyor mu?


14

Android uygulamaları temelde sanal bir işlemci olan bir JVM (Dalvik VM) üzerinde çalıştığından ve her sanal yöntemin temel yonga setinin yerel talimatıyla eşlenmesi gerektiğinden, bu eşleme, bu eşlemenin ek yükü nedeniyle daha fazla güç tüketimine neden oluyor mu?

Bu soru Java'ya genişletilebilir ve "Java uygulamaları daha fazla güç kullanıyor mu?" Android telefonların diğer platformlara / telefonlara kıyasla bu kadar korkunç pil ömrüne sahip olmasının nedeni bu mu?

Edit : Cevaplara dayanarak ben yanlışlıkla JVM ve Dalvik birbirinin yerine konuşmuştu çünkü birkaç noktaya açıkladım. Bu bitte Java'dan sadece daha fazla güç kullanıp kullanmadığını ve evet ise, bu kavramsal olarak Android için de geçerli olup olmadığını ve pil ömrünün azalmasına neden olduğunu sormak için konuşuyorum.

Bağlam : Wikipedia'dan alıntılanmıştır:

  1. Java bayt kodu, C kodu için montaj diline benzer.
  2. Bir derleyicinin bakış açısından, Java sanal makinesi, kod oluşturulabilen bir komut kümesi olan Java bayt koduna sahip başka bir işlemcidir.
  3. JVM bir yığın mimarisine sahiptir. Dalvik, JVM ile aynı sanallaştırma türü olmayan ve kayıt mimarisine sahip bir işlem sanal makinesidir.

Java programlama dili bytecode (derleme benzeri) olarak derlendiğinden ve sanal bir işlemci üzerinde çalıştığından, gerçek yazılım kodu taşınabilirliği sağlar. Ayrıca, Linux için bir JVM olduğu ve Linux açık donanıma taşındığı için, kombinasyon tüm yığın boyunca gerçek uygulama taşınabilirliği sağlayabilir.

Güç : Soru esasen buna dayanır - yazılım kodunuzun veya uygulamanızın aynı işlevselliği için, CPU saat döngülerinizin yüzde kaçının çalışma süresi ortamına atfedildiği. Bu, modern JVM'lerin Just-In-Time derleme ortamıdır, burada bytecode temel yonga setinin yerel talimatına derlenmişse, çalışma süresi sadece jit derlemesi sırasında aktif olmalıdır. Böylece, güç tüketimi yükü ile sonuçlanması beklenen çalışma zamanı ortamına sahip olmak için ne kadar daha fazla CPU saat çevrimi kullanılır. Statik olarak yazılmış ve oluşturulmuş dillerle karşılaştırıldığında göreceli performansla değil, yalnızca güç tüketimi yönüyle ilgileniyorum ve Java'nın avantajlarını anlıyorum. İlişkili olabilecek alt sorular:

  • Java Çalışma zamanı libc'yi işlevselliği için kullanıyor mu?
  • Güç tüketimiyle ilgili bu noktalardan herhangi biri Dalvik VM ve Android'e mi çevriliyor?
  • Ekran ve kablosuz yonga setleri hakkında konuşmadan Android'in zayıf pil tüketimini genelleştirmek yerine - iPhone 5'in modern Nexus telefonlara kıyasla küçük olan 1440 mAH'lık bir pile sahip olduğundan bahsedelim. Tüm bu düşünce treni (Java, Sanal işlemci, talimat haritalama, Android) ortaya çıktı çünkü bir iphone-sadık arkadaşı, bunun iphone'unun (müthiş) bağlantımdan daha iyi pil ömrüne sahip olmasının olası nedeni olabileceğini iddia etti.

Her durumda, aşağıdaki cevaplar için teşekkürler.


1
Pilleri mAh'leriyle karşılaştırmayın. Bu güncel; teorik olarak 10000000 mAh olan bir pilden daha fazla güce (watt-saat) sahip 2 mAh bir piliniz olabilir. Voltaja bağlıdır. Nexus 4'ün 8 Wh bataryası, iPhone 5'in de 5.45 Wh bataryası var. Fark büyük ölçüde ekran boyutundan kaynaklanıyor: Nexus 4, 4.7 inç diyagonal bir ekrana sahipken, iPhone 5, daha yüksek çözünürlük ve daha yüksek parlaklığa sahip (608 cd / m ^ 2 - 500) 4 inçlik bir ekrana sahip. ayrıca oldukça farklı: Nexus 4, 1.5 GHz'de dört çekirdekli; iPhone 5, 1.3 GHz'de çift çekirdekli. Daha hızlı = daha fazla pil kullanımı.
allquixotic

1
Temel olarak iPhone'lar daha küçük bir pille daha uzun ömürlüdür çünkü tüm platform daha küçük olacak şekilde tasarlanmıştır: daha az fiziksel alan, daha küçük ekran, daha küçük CPU, daha az çekirdek, daha az kapasite, daha az performans, daha az, daha az, daha az. Android telefonlar ters yönde ilerliyor: daha büyük ve daha fazla çekirdek, daha fazla güç ve daha hızlı. Tabii ki aynı pil ömrünü elde etmek için daha büyük pillere ihtiyaç duyacaklar. Bazen büyük bir pil bile tüketimi doğru şekilde telafi etmez ve bu durumda zayıf pil ömrüne sahip bir telefonunuz olur.
allquixotic

Yanıtlar:


25

Sorunuz birçok hatalı varsayımı temel almaktadır . Onları temizlemeye çalışayım:

  • "JVM (Dalvik VM)" dediniz. Bu "Uçak (Bisiklet)" demek gibi. Bu iki şeyin birbirleriyle hiçbir ilgisi yoktur.

  • "... temelde sanal bir işlemci" dediniz. Sadece yanlış. Öyle değil o kadar esasen denk olduğunu, sözcükler "Sanal Makine" veya kısaltması "VM" teknik bir bağlamda kullanıldığı her zaman, vaka VMware Workstation . Bunun nedeni, VMware gibi ürünlerin aslında yalnızca CPU'yu değil, tüm bilgisayarı taklit etmesi ve başka bir işletim sisteminin üstünde bir işletim sistemi çalıştırmasıdır. Dalvik VM yok değil böyle çalışmaz. Yakınında bile değil.

  • Java sadece bir programlama dilidir. Sözdizimi. Android / Dalvik programları, Java Sanal Makinesi üzerinde çalışan Java adlı tamamen ilgisiz bir masaüstü / sunucu programlama diliyle aynı veya çok benzer bir sözdizimini kullanır. Teorik olarak, ikisi de üst düzey programlama dilleri olduğundan, C koduyla hemen hemen aynı hızda olan Java kodunu yazabilirsiniz. Şeytan, kütüphane çağrılarının uygulanmasının ve çalışma zamanının tasarlanma şeklinin ayrıntılarında, dilin sözdizimi ile çok az ilgisi var.

  • Dalvik VM, Sun Java Hotspot JVM veya Java programlama dili sözdiziminin yüksek güç tüketiminden sorumlu olduğunu söylemek aşırı genellemedir. Bunun nedeni, konuştuğunuz şeyi başka bir şeyin performansıyla karşılaştırmanız gerektiğidir . En genel durumda, her iki platformun da "en iyi durum" özelliklerini karşılaştırırken, prensip olarak diğer platformlardaki programlardan daha hızlı veya daha hızlı Dalvik uygulamaları yapmak mümkündür. Otomatik bellek yönetimi ve JIT derlemesi dışında - iOS ve JavaScript / HTML5 dahil olmak üzere neredeyse tüm programlama ortamlarında standart olan özellikler - Dalvik'i Objective-C, .NET, Ruby'den ayıran çok az şey var. Oracle Hotspot JVM, Python vb.

  • "Java yavaş" algısı, Java'nın eski sürümleriyle ilgili bir sorundan kaynaklanmaktadır, çünkü ya Just-In-Time Derleyici (JIT) ya da sahip oldukları JIT işlevselliği çok sınırlıdır. JVM'nin Just-In Time Derleyicisi vardıuzun zamandır. JIT derleyicisi, çalışma zamanının (örneğin, JVM), işlemciden bağımsız bayt kodunu (örneğin Java bayt kodu) alan ve CPU için yerel talimatlar halinde derleyen bir parçasıdır. Bu işlem, Java programı başlatıldığında yapılır ve gelişmiş JIT derleyicileri, gözlemlenen sonuçlara göre performanslarını artırmak için çalışma zamanında tek tek işlevleri veya yönergeleri optimize edebilir. Örneğin, bir yöntem çağrıldığı her seferinde doğru döndürürse, ancak orijinal bayt kodundan bunu gerçekleştireceği açık değilse, JIT derleyicisi bunun sadece true döndürdüğünü fark edebilir ve işlev çağrısını bir kodlanmış değeri "true". Bu sadece bir örnek.

  • JIT derleme ve çalışma zamanı dinamik kod analizi teknikleri son yıllarda büyük ilerlemeler kaydetmektedir. Bilgisayar bilimi toplumda birçok başka on yıl ya da iki, Java, C # ve Ruby dinamik olarak yorumlanır / derlenmiş dilde mevcuttur sofistike analizler, bu yüzden, çoğu durumda, bu diller yürütmek olacağı ileri olacağına inanıyoruz hızlı at C ve C ++ gibi statik olarak derlenmiş dillerden daha uzun çalışma süresi. Çünkü statik derleyiciler genellikle derleme sırasında kod derleme ile sınırlıdır ve kod çalışma zamanında değiştirilmez. Ancak programın kodunun kendini yeniden yazabileceği bir çalışma ortamındadaha verimli bir şekilde gerçekleştirmek için yürütme sırasında, kodun performansını analiz ederek ve kodun karmaşıklığını veya CPU'da çalıştırılan komut sayısını azaltmak için ayarlamalar yaparak elde edilebilecek muazzam bir miktar yukarı doğru vardır. Sıkça kod olarak adlandırılan kod için, analizi gerçekleştirmek için gereken zaman yatırımı, art arda daha hızlı kod çağırmanın performans avantajlarından çok daha ağır basar.

  • Android Dalvik VM'nin de bir JIT içerdiği ve Sun / Oracle JVM ile aynı bayt kodu biçimini kullanmadığı unutulmamalıdır. Dalvik'in JIT'si düşük bellek ortamları için optimize edilmiştir ve çalışma zamanı performans geliştirmelerine göre çok ileri düzeydedir. Bu nedenle, JVM ve Dalvik'in Java tabanlı çalışma zamanı ortamları için benzer optimizasyonlar uygulaması bir tesadüf , ancak kaputun altında oldukça farklılar.

  • Dalvik'in kendisini unutmayın; Linux çekirdeği; düşük seviyeli sistem süreçleri; ve Android web tarayıcılarının çekirdeği (hem Firefox hem de Chrome) yerel C / C ++ ile yazılmıştır ve bu nedenle bir Dalvik programının genel olarak endişeleri yoktur. Bu, iOS ile aynı. Bahsettiğin Eğer saf Android bunun üstüne oturur taşıyıcı / üçüncü taraf kabartmak değil, temel Android edilir nelerden oluştuğu çok büyük bir oran değil Dalvik kullanılarak yazılmıştır.

  • Android'deki uygulama geliştiricileri, kendi seçimlerine göre, Dalvik'i atlayarak yerel kod yazabilirler. Bir uygulama geliştiricisi Dalvik'in kodlarının performansında bir darboğaz olarak davrandığını veya çok fazla pil tüketmesine neden olduğunu hissettiğinde, Google'ın onayını almak zorunda kalmadan C / C ++ veya hatta montaj kodu yazabilirler bunu yapmak ve uygulamalarını böyle dağıtmak.

Android pille çalışan bir cihazın veya herhangi bir cihazın pil ömründe sorun yaşamasının bazı gerçek nedenleri şunlardır :

  • CPU, ekran veya veri bağlantısını uyanık tutan uygulamalar. Özellikle, LTE gibi 4G yonga setleri açıldıklarında çok fazla enerji kullanırlar, bu nedenle LTE çipini sürekli olarak birkaç kilobaytlık veri aktarmak için uyandıran arka plan programlarınız varsa, pilinizi çok hızlı tüketir. Parlaklığı en aza indirmezseniz, modern akıllı telefon ve tabletlerdeki ekran da çok enerji yoğundur.

  • Cihazda olması gereken ve kaldırılamayan "Bloatware". Bazı vicdansız taşıyıcılar, CPU döngülerini alan ve veri bağlantısını uyanık tutan bloatware çalıştırmanızı gerektirir. Bunun nedeni, bloatware'in yazılım geliştiricilerinin yetersizliği veya akıllı telefonunuzdaki etkinliklerinizi izleme ve bunları piliniz için çok enerji yoğun olan veri madenciliği için uzak bir sunucuya göndermenin kasıtlı bir amacı olabilir.

Son olarak, Android'in diğer mobil platformlardan daha kötü pil ömrü sorunları olduğunu değerlendirmenize katılmıyorum. Bazı telefonlar ve aygıtlar, pilin donanımın enerji tüketimine göre kapasitesi nedeniyle gerçekten pil ömrü sorunları yaşayabilir; zayıf optimize edilmiş güç ayarları (kullanıcı, operatör veya üretici tarafından seçilir); veya telefonda çipleri her zaman uyanık tutan bloatware uygulamaları. Ancak pil sorunları olan her cihaz örneği için size mükemmel pil ömrüne sahip bir cihaz örneği verebilirim. "Bu Dalvik" veya "Linux" veya "Java" yı genellemenin basit bir yolu yoktur. Güç optimizasyonu, performans, yanıt verme, ve kullanıcının pil ömrü beklentileri, her seçim için artıları ve eksileri ile. Bir cihazın güç profilini tam olarak anlamak için bataryanın kendisine, tüm donanıma ve aygıtta çalışan tüm yazılımlara yakından bakmanız gerekir.


1
+1 Bu biraz tl; dr ama her şeye sahip, hatta iyi bir teknik cevap.
Doktoro Reichard

Teşekkürler, tüm adil noktalar. Yanlışlıkla bazı terimleri birbirinin yerine kullandım, çünkü bilmediğim bir şey soruyordum. Hala ilgileniyorsanız, sorunun kendisinde bazı düzenlemeler yaptık.
PKM

Bu cevap oldukça bilgilendiricidir, ancak sorudan çok yol aldı. Sorunun özü, VM'nin ek yükü daha fazla CPU zamanı kullandı mı, o zaman kullandığı optimizasyonlarla tasarruf ediyor. Sorunun diğer taraf için de bir ipucu olmasına rağmen, Android'in neden iO'lardan daha iyi olduğuna daha fazla dönüştü.
Igor Čordaš

Burada da kusurlu bir varsayım var. IOS, Mac OS'nin otomatik bellek yönetiminden yoksundur. Ve gerçekten de Dalvik'i tipik problemleriyle "Java" yapan yönetim budur. Birkaç ay önce Dalvik'in Çöp Toplama (GC) sorunları hakkında oldukça iyi bir genel bakış vardı: anandtech.com/show/8231/… - pil ömrünü de etkiliyorlarsa veya sadece performansı söyleyemem.
pvblivs

@pvblivs iOS için "yüksek seviyeli" uygulama kodu yazmanın GC yerine otomatik referans sayımı kullandığı doğru olsa da Dalvik GC ve "bu nedenle" kullanıyor (bunun mutlaka doğru olduğunu söylemiyorum) o ve iOS Android daha ... Sen Android uygulamaları olmadığını tür benim açımdan eksik hala "daha verimli" olduğunu) en akla yatkın az olduğunu var Java yazılacak ve aslında assembler veya edilebilir isterseniz yerli ARM kodu bile! Performansa son derece duyarlı uygulamalar ve yerleşik öğeler GC olmadan yerel kod kullanıyor olmalıdır .
allquixotic

5

Bu cevapta, performans pazar payının% 80'inden fazlasını aldığından performansı Android ve IOS ile karşılaştıracağım.

Java uygulamaları daha fazla güç kullanmaz. ( http://www.javarants.com/2004/05/04/looks-like-apple-should-switch/ ) Oracle'ın Java VM'si veya gerçekte Google'ın Dalvik VM'si IOS'un Objective-C'sinden çok daha verimli kabul edilir. Java, telefonda yürütülmeden önce kodu en iyi duruma getirebilir ve bu da çok daha iyi performansa neden olabilir. Java kütüphaneleri Açık Kaynaktır ve bu nedenle yüzlerce farklı geliştirici tarafından optimize edilmiştir. Öte yandan IOS ile sadece Apple geliştiricileri kodu değiştirebilir. Daha az inceleme = daha az potansiyel performans.

Android programları aynı zamanda Object-C'den (IOS'ta desteklenen tek dil) daha hızlı tartışılabilecek yerel C kodunu da çalıştırabilir.

Google'ın Dalvik VM'yi kullanmaya karar vermesinin nedeni taşınabilirliktir. Android'in resmi olarak çalıştırabileceği dört farklı CPU mimarisini biliyorum (ARM, MIPS, x86, I.MX). Diğer tüm telefon işletim sistemleri sadece bir (ARM) kullanabilir. ( http://en.wikipedia.org/wiki/Comparison_of_mobile_operating_systems ) Farklı CPU türlerini örneğin IPhone ile karşılaştırmak haksızlıktır. Android IPhone'da çalıştırılsaydı, Android üstün performans ve pil ömrü ile karşılaştırılabilir olurdu.

"Java uygulamaları daha fazla güç kullanıyor mu?" Sadece hayır.
Android telefonlar neden diğer platformlara / telefonlara kıyasla bu kadar korkunç pil ömrüne sahip? Birçok Android telefon Apple'ın IPhone'undan daha ucuz üretilmiştir, ancak fiyat farkına bakın. IPhone, içindeki daha büyük pil nedeniyle daha pahalıya mal oluyor (ve ortalama yavaş CPU'da). Android telefonum (Google Galaxy Nexus), IPhone 4G ile karşılaştırılabilir pil ömrüne sahip ancak çok daha hızlı donanım özelliklerine sahip (1GHz ve 1.2GHZ).

EDIT: Java, programcının bilgisi gerektirmeden kodu optimize edebilir. Mükemmel, C kodu her zaman Java / Objective-C / C # 'dan daha hızlı çalışır; Bununla birlikte, kaç programcı mükemmel olduğunu söyledi? JVM düzeyinde Java ve kütüphaneler açık kaynak geliştirme ilkeleri nedeniyle her zaman "daha mükemmel" olacaktır. ( http://www.infoq.com/news/2012/03/Defects-Open-Source-Commercial )

DÜZENLEME 2: Küçük bilgi paketi: Lenovo'nun yeni P780 Android Telefonu - IPhone'da 42 saat vs 12 saat konuşma.


1
Sorunun kendisinin "... Android telefonların diğer platformlara / telefonlara kıyasla böylesine korkunç bir pil ömrü var" gibi tamamen asılsız iddialarda bulunduğunu iddia ediyorum . Sadece doğru değil.
allquixotic

İlk bağlantınızın şüpheli kalitede IMHO olduğunu eklemek istiyorum: kıyaslama dosyaları gitti ve bir yorumcu bağlantının posterinin fikrini reddetti. Bu yazı, birleştirilemeyen kaynakların ve öznel ifadelerin eksikliği nedeniyle taraflı görünüyor.
Doktoro Reichard

İlk yorumcu biraz haklı. Ayrıntılı testler yapılmadan tüm cevaplar önyargılı olacaktır. Android telefonların pil ömrünün oldukça korkunç olduğunu kabul ediyorum, ancak birçok kişinin belirttiği gibi kesinlikle VM'den kaynaklanmıyor.
Igor Čordaš

Yakında tüm bu bilgiler Android'de ART çalışma zamanının gelmesiyle zaten güncel olmayacak.
Mark Lopez

3

Evet, artan güç tüketimi ile ilgilidir - soyutlama katmanları bunu yapacaktır. Aynı zamanda hızda bir azalmaya yol açar (aynı madalyonun karşı tarafı - bir şey daha büyük bir yüke sahipse, daha fazla CPU'yu gerçekleştirmek ve kullanmak daha uzun sürer). Doğru anlıyorsam, bu NDK'nın yaptığı avantajlardan biridir - belirli bir kod yazarak belirli işlemciler için hızlandırmaya izin verin.

Bununla birlikte, çoğu iş için, bir VM çalıştırmanın "güçle ilgili" ek yüklerinin diğer hususlar tarafından gölgede bırakıldığını hayal ediyorum - çoğu program için ekran ve radyo kullanımı gücün çoğunu tüketecektir.


Haklısın. Oled ekran üzerinde siyah arayüz elemanları kullanan bir çok durumda daha fazla güç tasarrufu olurken çoğu durumda NDK ve SDK'ya gider.
Igor Čordaš

3

Diğer tüm posterlerle ilgili olarak, burada en önemli olanın C / C ++ / Java'nın var olup olmadığı değil, uygulamaların ne yaptığı olduğuna inanıyorum.

Güç tüketimi doğrudan işleme ile eşleştiğinden, kendime bir programın ne işlem yapacağını sorardım.

Numara eklediğinizi varsayalım. Diyelim ki 2.000.000'e ulaşana kadar sonsuz döngüde 2 ile 2 ekliyorsunuz. İki soru ortaya çıkıyor:

  1. Nasıl uygulanır: Döngü mü? Bir while döngüsü mü? (Bu bir Git / Etiket kesmek mi?)
  2. Kod nasıl optimize ediliyor?

Bu iki soru nihayetinde işlemcinin kaç işlem yapması gerektiğini ve nihayetinde bir cihazın ne kadar güç kullandığını tanımlar. Bununla birlikte, sanallaştırılmış bir ortam çalıştırmanın "ek yükü", programın tamamı üzerinde Java tarafından yapılan önceki optimizasyon nedeniyle ihmal edilebilir, ancak daha sonra, uygulamanın ne yaptığına bağlıdır.


0

Evet.

Sanal makineler 'her şeyi iki kez yapar' ve her zaman verimli bir şekilde değil. Bu nedenle, 'gerçek makine' ile aynı talimatları işlemek için en az iki kat daha fazla güç kullanacaklar. Sanal bir makinenin varlığı işleri yavaşlatır ve daha fazla güç kullanır. Temel olarak, iOS ve Windows gibi işletim sistemleri her şeyi daha hızlı ve daha az güç tüketimiyle yapacak.

Bu, ekran geçişleri, sayfa yükleme, gezinme ve bunun gibi şeylerde gerçek farklılıklar anlamına gelir. Şu anda Android (VM) ve Windows Phone'u karşılaştırıyorum ve daha yavaş bir işlemci (1GHz vs 1.6GHz) ile bile, Windows aynı tür görevleri yapan Android'den önemli ölçüde daha iyi performans gösteriyor.

Bununla birlikte, çoğu insanın dikkatini çeken şey, bir uygulama yüklediklerinde ve aniden pilleri daha hızlı tükendiğinde ortaya çıkar. Bu gerçekten sanal makine nedeniyle değil, ama kaynakları açlıkla kullanan bir uygulama.

Sanal makine işletim sisteminin tüm nedeni, taşınabilirlik, bir işletim sistemini dayandırmak için iyi bir neden değildir. İnsanların favori mimarileri ile telefon satın aldıklarını ve taşınabilir oldukları için Android kullandıklarını görüyor musunuz? İnsanların daha yüksek performans ve güvenilirlikten vazgeçtiklerini ve android olmayan telefonlarına android taktıklarını görüyor musunuz? İnsanlar bir Android Telefon veya bir Windows Telefon veya bir IPhone, vb. Satın alır. Düşük maliyetli cihazlarda taşınabilirlik için performanstan ödün vermek pratik değildir. Başarısız olmak iyi bir fikirdi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.