14 votes

Android ou Java consomment-ils plus d'énergie puisqu'ils fonctionnent sur une machine virtuelle ?

Étant donné que les applications Android fonctionnent sur une JVM (Dalvik VM), qui est en fait un processeur virtuel, et que chaque instruction virtuelle doit être mise en correspondance avec l'instruction native du chipset sous-jacent, cette mise en correspondance entraîne-t-elle une augmentation de la consommation d'énergie en raison de la surcharge de cette mise en correspondance ?

Cette question peut être étendue à Java et être formulée comme suit : "les applications Java consomment-elles plus d'énergie ?". Est-ce la raison pour laquelle les téléphones Android ont une durée de vie de la batterie si épouvantable par rapport aux autres plateformes/téléphones ?

Editar : Sur la base des réponses, j'ai clarifié quelques points car j'avais parlé par erreur de JVM et de Dalvik de manière interchangeable. Dans ce passage, je parle de Java uniquement pour demander s'il consomme plus d'énergie et si oui, est-ce que cela s'applique conceptuellement à Android également et est-ce que cela entraîne une diminution de l'autonomie de la batterie.

Contexte : cité de Wikipedia :

  1. Le bytecode Java est analogue au langage d'assemblage pour le code C.
  2. Du point de vue d'un compilateur, la machine virtuelle Java n'est qu'un autre processeur doté d'un jeu d'instructions, le bytecode Java, pour lequel du code peut être généré.
  3. La JVM a une architecture en pile. Dalvik est une machine virtuelle de processus qui n'est pas le même type de virtualisation que JVM et possède une architecture de registre.

Étant donné que le langage de programmation Java est compilé en bytecode (langage assembleur) et qu'il fonctionne sur un processeur virtuel, il permet une véritable portabilité du code logiciel. De plus, étant donné qu'il existe une JVM pour Linux et que Linux a été porté sur du matériel ouvert, cette combinaison permet une véritable portabilité des applications sur l'ensemble de la pile.

Puissance : La question se résume essentiellement à ceci : pour le même ensemble de fonctionnalités de votre code logiciel ou application, quel pourcentage des cycles d'horloge de votre CPU est attribué à l'environnement d'exécution. Il s'agit de l'environnement de compilation Just-In-Time des JVM modernes où si le bytecode est compilé à l'instruction native du chipset sous-jacent, alors l'environnement d'exécution ne devrait être actif que pendant la compilation JIT. Ainsi, combien de cycles d'horloge supplémentaires du CPU sont utilisés pour avoir l'environnement d'exécution qui est censé entraîner une surconsommation d'énergie. Je ne m'intéresse qu'à l'aspect de la consommation d'énergie, et non aux performances relatives par rapport aux langages construits et typés statiquement, et je comprends les avantages de Java. Sous-questions qui pourraient être liées :

  • Le moteur d'exécution Java utilise-t-il la libc pour ses fonctionnalités ?
  • L'un de ces points relatifs à la consommation d'énergie s'applique-t-il à la VM Dalvik et à Android ?
  • Au lieu de généraliser la mauvaise consommation de batterie d'Android sans parler de l'écran et des puces sans fil, parlons du fait que l'iPhone 5 a une batterie de 1440 mAH, ce qui est minuscule comparé aux téléphones Nexus modernes. Toute cette réflexion (Java, processeur virtuel, mappage des instructions, Android) est née parce qu'un ami fidèle à l'iPhone a affirmé que cela pouvait être la raison probable pour laquelle son iPhone avait une meilleure autonomie que mon (génial) Nexus.

En tout cas, merci pour les réponses ci-dessous.

25voto

Giuseppe R Points 1325

Votre question est basée sur beaucoup de des hypothèses erronées. Permettez-moi d'essayer de les clarifier :

  • Vous avez dit "JVM (Dalvik VM)". C'est comme dire "Avion (Bicyclette)". Ces deux choses n'ont absolument rien à voir l'une avec l'autre.

  • Vous avez dit "...qui est en fait un processeur virtuel". C'est tout simplement faux. Il est no que, chaque fois que les mots "machine virtuelle" ou l'acronyme "VM" sont utilisés dans un contexte technique, cela équivaut essentiellement à VMware Workstation . En effet, des produits comme VMware font en effet émulent un ordinateur entier, et pas seulement le CPU, et exécutent un système d'exploitation au-dessus d'un autre système d'exploitation. Dalvik VM fait no travailler comme ça. Pas du tout.

  • Java n'est qu'un langage de programmation. C'est une syntaxe. Il se trouve que les programmes Android/Dalvik utilisent la même syntaxe ou une syntaxe très similaire à celle d'un langage de programmation de bureau/serveur totalement indépendant appelé Java, qui fonctionne sur une machine virtuelle Java. En théorie, vous pouvez écrire du code Java qui est presque aussi rapide que du code C, puisqu'il s'agit de deux langages de programmation de haut niveau. Le problème réside dans les détails de la mise en œuvre des appels de bibliothèque et dans la manière dont le moteur d'exécution est conçu, ce qui a très peu à voir avec la syntaxe du langage.

  • C'est une généralisation excessive que de dire que Dalvik VM, la JVM de Sun Java Hotspot ou la syntaxe du langage de programmation Java sont responsables d'une consommation d'énergie élevée. La raison en est que vous devez comparer ce dont vous parlez aux performances de autre chose . Dans le cas le plus général, lorsque vous ne faites que comparer les capacités "optimales" des deux plates-formes, il est en principe possible de créer des applications Dalvik qui sont aussi rapides, voire plus rapides, que les programmes sur n'importe quelle autre plate-forme. En dehors de la gestion automatique de la mémoire et de la compilation JIT - des fonctionnalités qui sont standard dans presque tous les environnements de programmation de nos jours, y compris sur iOS et en JavaScript / HTML5 - il y a très peu de choses qui séparent Dalvik de Objective-C, .NET, Ruby, la JVM Oracle Hotspot, Python, et ainsi de suite.

  • La perception selon laquelle "Java est lent" est due à un problème avec les anciennes versions de Java, en ce sens qu'elles ne disposaient pas d'un compilateur juste-à-temps (JIT) ou que le JIT dont elles disposaient avait des fonctionnalités très limitées. La JVM a eu un Compilateur juste-à-temps depuis très longtemps. Un compilateur JIT est une partie du moteur d'exécution (par exemple, la JVM) qui prend le bytecode indépendant du processeur -- par exemple le bytecode Java -- et le compile en instructions natives pour le CPU. Ce processus est effectué au lancement du programme Java, et les compilateurs JIT avancés peuvent optimiser des fonctions ou des instructions individuelles au moment de l'exécution pour améliorer leurs performances en fonction des résultats observés. Par exemple, si une méthode renvoie vrai à chaque fois qu'elle est appelée, mais qu'il n'est pas évident, d'après le bytecode d'origine, qu'elle le fasse, le compilateur JIT peut reconnaître qu'elle renvoie juste vrai, et remplacer l'appel de fonction par une valeur codée en dur de "vrai". Ceci n'est qu'un exemple.

  • Les techniques de compilation JIT et d'analyse dynamique du code d'exécution ont fait d'énormes progrès ces dernières années. De nombreux membres de la communauté informatique pensent que, dans une ou deux décennies, l'analyse sophistiquée disponible dans les langages interprétés/compilés dynamiquement, tels que Java, C# et Ruby, sera si avancée que, dans la plupart des cas, ces langages exécuteront plus rapide à l'exécution que les langages à compilation statique comme C et C++. Cela s'explique par le fait que les compilateurs statiques se limitent généralement à compiler le code au moment de la construction, et que le code n'est pas modifié au moment de l'exécution. Mais dans un environnement d'exécution où le code du programme peut se réécrire lui-même pendant l'exécution pour qu'il soit plus efficace, il est possible de réaliser un énorme gain en analysant les performances du code et en effectuant des ajustements pour réduire la complexité du code ou le nombre d'instructions qui sont exécutées sur le CPU. Pour le code fréquemment appelé, l'investissement en temps nécessaire pour effectuer l'analyse est largement compensé par les avantages en termes de performance de l'appel répété de code plus rapide.

  • Il convient de noter que la VM Dalvik d'Android contient également un JIT et qu'elle n'utilise pas le même format de bytecode que la JVM de Sun/Oracle. Le JIT de Dalvik est optimisé pour les environnements à faible mémoire, et il est très avancé en termes d'amélioration des performances d'exécution. C'est donc un peu une coïncidence que la JVM et Dalvik implémentent le JIT de Sun/Ocle. similaire pour leur environnement d'exécution Java respectif, mais sous le capot, ils sont très différents.

  • N'oubliez pas que Dalvik lui-même, le noyau Linux, les processus système de bas niveau et le cœur des navigateurs Web d'Android (Firefox et Chrome) sont écrits en C/C++ natif et ne présentent donc aucun des problèmes de surcharge que connaîtrait un programme Dalvik. C'est la même chose pour iOS. Si vous parlez de Android pur et non pas le bloat des opérateurs et des tiers qui se trouve au-dessus, une très grande partie de ce qui compose le noyau d'Android est no écrit en utilisant Dalvik.

  • Les développeurs d'applications sur Android peuvent également, à leur gré, écrire du code natif, en contournant Dalvik. Si un développeur d'applications estime que Dalvik constitue un goulot d'étranglement pour les performances de son code ou qu'il entraîne une consommation excessive de la batterie, il peut simplement écrire du code C/C++ ou même du code assembleur s'il le souhaite, sans avoir à obtenir l'autorisation de Google, et distribuer son application de cette manière.

Voici quelques réel raisons pour lesquelles un appareil Android fonctionnant sur batterie, ou tout peut avoir des problèmes d'autonomie de la batterie :

  • Les applications qui maintiennent le processeur, l'écran ou la connexion de données en veille. En particulier, les puces 4G telles que LTE consomment beaucoup d'énergie lorsqu'elles sont allumées, donc si vous avez des programmes d'arrière-plan qui réveillent continuellement la puce LTE pour transférer quelques kilo-octets de données, cela va vider votre batterie très rapidement. L'écran des smartphones et des tablettes modernes est également très énergivore, à moins que vous ne réduisiez la luminosité au minimum.

  • Les "bloatware" qui doivent être présents sur l'appareil et qui ne peuvent pas être désinstallés. Certains opérateurs peu scrupuleux exigent que vous exécutiez un bloatware qui consomme des cycles de l'unité centrale et maintient la connexion de données éveillée. Cela peut être dû soit à l'incompétence des développeurs du bloatware, soit à un objectif intentionnel de surveiller vos activités sur votre smartphone et de les envoyer à un serveur distant pour l'exploitation des données, ce qui est très gourmand en énergie pour votre batterie.

Enfin, je ne suis pas d'accord avec votre évaluation selon laquelle Android présente des problèmes d'autonomie de batterie plus graves que sur les autres plateformes mobiles. Certains téléphones et appareils peuvent en effet avoir des problèmes d'autonomie, soit en raison de la capacité de la batterie par rapport à la consommation d'énergie du matériel, soit en raison de paramètres d'alimentation mal optimisés (choisis par l'utilisateur, l'opérateur ou le fabricant), soit en raison d'applications bloatware qui maintiennent les puces du téléphone éveillées en permanence. Mais pour chaque exemple d'appareil ayant des problèmes de batterie, je peux vous donner un contre-exemple d'appareil ayant une excellente autonomie. Il n'y a pas de moyen simple de généraliser que "c'est Dalvik" ou "c'est Linux" ou "c'est Java". L'optimisation de la consommation d'énergie est un méli-mélo matériel/logiciel complexe de préoccupations concurrentes, notamment les performances, la réactivité et les attentes de l'utilisateur en matière d'autonomie de la batterie, avec des avantages et des inconvénients pour chaque choix. Pour bien comprendre le profil énergétique d'un appareil, il faut examiner de près la batterie elle-même, tout le matériel et tous les logiciels qui fonctionnent sur l'appareil.

5voto

Mark Lopez Points 973

Dans cette réponse, je comparerai les performances d'Android et d'IOS, ces deux systèmes représentant plus de 80 % des parts de marché.

Les applications Java ne consomment pas plus d'énergie. ( http://www.javarants.com/2004/05/04/looks-like-apple-should-switch/ ) La VM Java d'Oracle ou en réalité la VM Dalvik de Google est considérée comme beaucoup plus efficace que l'Objective-C d'IOS. Java est capable d'optimiser le code avant qu'il ne soit exécuté sur le téléphone, ce qui pourrait se traduire par de bien meilleures performances. Les bibliothèques Java sont open source et ont donc été optimisées par des centaines de développeurs différents. En revanche, avec IOS, seuls les développeurs d'Apple peuvent modifier le code. Moins de révision = moins de performances potentielles.

Les programmes Android sont également capables d'exécuter du code C natif, qui peut être considéré comme plus rapide que le langage Object-C (le seul langage supporté par IOS).

La raison pour laquelle Google a décidé d'utiliser la VM Dalvik est la portabilité. Je connais quatre architectures de CPU différentes sur lesquelles Android peut officiellement fonctionner (ARM, MIPS, x86, I.MX). Alors que tous les autres OS pour téléphone ne peuvent en utiliser qu'une seule (ARM). ( http://en.wikipedia.org/wiki/Comparison_of_mobile_operating_systems ) Il est donc injuste de comparer différents types de CPU avec, par exemple, l'IPhone. Si Android était exécuté sur un IPhone, Android aurait des performances et une autonomie comparables ou supérieures.

"Les applications Java consomment-elles plus d'énergie ?" Tout simplement non.
Pourquoi les téléphones Android ont-ils une autonomie aussi épouvantable par rapport aux autres plateformes/téléphones ? De nombreux téléphones Android sont moins chers que l'iPhone d'Apple, mais regardez la différence de prix. L'IPhone coûte plus cher à cause de la batterie beaucoup plus grande qu'il contient (et de son processeur en moyenne plus lent). Mon téléphone Android (Google Galaxy Nexus) a une autonomie comparable à celle de l'IPhone 4G, mais son matériel est beaucoup plus rapide (1 GHz contre 1,2 GHz).

EDIT : Java peut optimiser le code sans que les connaissances du programmeur soient nécessaires. Parfait, le code C s'exécutera toujours plus vite que Java / Objective-C / C# ; Cela dit, combien de programmeurs sont parfaits ? Au niveau de la JVM, Java et les bibliothèques seront toujours "plus parfaits" en raison de ses principes de développement open source. ( http://www.infoq.com/news/2012/03/Defects-Open-Source-Commercial )

EDIT 2 : Petite information : Le nouveau téléphone Android P780 de Lenovo offre 42 heures de conversation contre 12 heures pour l'IPhone.

3voto

porto alet Points 315

Oui, il y a un lien avec l'augmentation de la consommation d'énergie - les couches d'abstraction y contribuent. Cela entraîne également une diminution de la vitesse (le revers de la médaille : si un processus a une plus grande surcharge, il prendra plus de temps et utilisera donc plus de CPU). Si je comprends bien, c'est l'un des avantages de ce que le NDK permet d'accélérer les processeurs spécifiques en écrivant un code spécifique.

Cela dit, pour la plupart des emplois, j'imagine que les frais généraux "liés à l'énergie" de l'exécution d'une VM sont éclipsés par d'autres considérations - pour la plupart des programmes, l'utilisation de l'écran et des radios consommera la majeure partie de l'énergie.

3voto

Doktoro Reichard Points 5220

En ce qui concerne toutes les autres affiches, je crois que ce qui importe le plus ici n'est pas de savoir si C/C++/Java existe, mais ce que font les applications.

Comme la consommation d'énergie est directement liée au traitement, je me demande quel traitement un programme peut effectuer.

Dis que tu additionnes des chiffres. Disons que vous ajoutez 2 à 2 dans une boucle infinie jusqu'à ce que vous atteigniez 2.000.000. Deux questions se posent :

  1. Comment est-il mis en œuvre ? S'agit-il d'une boucle for ? S'agit-il d'une boucle while ? (S'agit-il d'un hack Goto/Label ?)
  2. Comment le code est optimisé.

Ces deux questions définissent en fin de compte le nombre d'opérations que le processeur doit effectuer et, en définitive, la quantité d'énergie utilisée par un appareil. Ceci étant dit, la "surcharge" liée à l'exécution d'un environnement virtualisé peut être négligeable en raison de l'optimisation préalable effectuée par Java sur l'ensemble du programme, mais là encore, tout dépend de ce que fait l'application.

0voto

Ja.

Les machines virtuelles "font tout deux fois", et pas nécessairement de manière efficace. Ainsi, elles utiliseront au moins deux fois plus de puissance pour traiter les mêmes instructions qu'une "vraie machine". La présence d'une machine virtuelle ralentit les choses et consomme plus d'énergie. En principe, les systèmes d'exploitation comme iOS et Windows font tout plus rapidement et consomment moins d'énergie.

Cela se traduit par des différences réelles dans les transitions d'écran, le chargement des pages, la navigation, etc. Actuellement, je compare Android (VM) et Windows Phone, et même avec un processeur plus lent (1 GHz contre 1,6 GHz), Windows surpasse largement Android pour le même type de tâches.

Cependant, ce qui attire l'attention de la plupart des gens, c'est lorsqu'ils installent une application et que leur batterie s'épuise soudainement plus rapidement. Cela n'est pas vraiment dû à la machine virtuelle, mais à une application qui utilise les ressources de manière avide.

La raison d'être d'un système d'exploitation de machine virtuelle, la portabilité, n'est pas une bonne raison de fonder un système d'exploitation. Voyez-vous des gens acheter des téléphones avec leur architecture préférée et utiliser Android parce qu'il est portable ? Est-ce que vous voyez des gens renoncer à des performances et à une fiabilité supérieures et mettre Android sur leurs téléphones non-Android ? Les gens achètent un téléphone Android, ou un Windows Phone, ou un IPhone, etc. Il n'est pas pratique de sacrifier les performances pour la portabilité des appareils à bas prix. C'était une bonne idée qui est devenue un échec.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X