Ви сказали "JVM (Далвік В.М.)". Це як сказати "Літак (велосипед)". Ці дві речі абсолютно не мають нічого спільного.
Ви сказали, "... що в основному є віртуальним процесором". Просто неправдиво. Це не так, що кожен раз, коли слова "віртуальна машина" або абревіатура "VM" вживаються в технічному контексті, це по суті еквівалентно робочій станції VMware . Це відбувається тому, що такі продукти, як VMware , насправді емулюють цілий комп'ютер, а не лише процесор, а операційна система працює над іншою операційною системою. Далвік В.М. не працює так. Навіть близько не.
Java - це просто мова програмування. Це синтаксис. Програми Android / Dalvik використовують той самий або дуже подібний синтаксис до абсолютно незв'язаної мови програмування робочого столу / сервера під назвою Java, яка працює на віртуальній машині Java. Теоретично, ви можете написати код Java, який має майже таку ж швидкість, як і код C, оскільки вони обидва мови програмування високого рівня. Чорт у деталях реалізації бібліотеки називає і те, як розроблено час виконання, що має дуже мало спільного з синтаксисом мови.
Можна сказати, що Dalvik VM, JVM Sun Java Hotspot JVM або синтаксис мови програмування Java є надмірним узагальненням. Причина в тому, що вам доведеться порівнювати все, про що ви говорите, з виконанням чогось іншого . У найзагальнішому випадку, коли ви просто порівнюєте можливості "найкращого випадку" обох платформ, в принципі можна зробити додатки Dalvik, які є настільки ж швидкими або швидшими, ніж програми на будь-якій іншій платформі. Крім автоматичного управління пам'яттю та компіляції JIT - функцій, які є стандартними майже у всіх програмуючих середовищах в наші дні, в тому числі на iOS та JavaScript / HTML5 - є дуже мало, що відокремлює Dalvik від Objective-C, .NET, Ruby, Oracle Hotspot JVM, Python тощо.
Сприйняття того, що "Java повільна", пов'язане з проблемою зі старими версіями Java, оскільки вони або не мали компілятора Just-in-Time (JIT), або JIT у них були дуже обмежені у функціональності. У JVM був компілятор часу, що склавсявже дуже давно. Компілятор JIT - це частина часу виконання (наприклад, JVM), яка приймає незалежний від процесора байт-код - наприклад, байт-код Java - і компілює його в рідні інструкції для процесора. Цей процес виконується під час запуску програми Java, а передові компілятори JIT можуть оптимізувати окремі функції чи інструкції під час виконання для покращення їх роботи на основі спостережуваних результатів. Наприклад, якщо метод повертає істину кожен раз, коли він викликається, але з оригінального байт-коду не очевидно, що це буде зроблено, компілятор JIT може визнати, що він просто повертає істинний, і замінити виклик функції на жорсткий- кодоване значення "true". Це лише один приклад.
Компіляція JIT та методи динамічного аналізу коду виконання протягом останніх років досягли величезних успіхів. Багато хто з спільноти інформатики вважають, що ще через десятиліття-два складний аналіз, доступний у динамічно інтерпретованих / компільованих мовах, таких як Java, C # та Ruby, буде настільки вдосконаленим, що в більшості випадків ці мови будуть виконуватись швидше при час виконання, ніж статично складені мови, такі як C і C ++. Це тому, що статичні компілятори, як правило, обмежуються компіляцією коду під час збирання, і код не змінюється під час виконання. Але в середовищі виконання, де код програми може переписати себепід час виконання для ефективнішого виконання існує величезна кількість перевертень, що може бути досягнуто за рахунок аналізу продуктивності коду та внесення коректив для зменшення складності коду або кількості інструкцій, які виконуються на процесорі. Для часто називаного коду час інвестицій, необхідний для проведення аналізу, значно перевищує переваги продуктивності багаторазового виклику швидшого коду.
Слід зазначити, що Android Dalvik VM також містить JIT, і що він не використовує той же формат байт-коду, що і JVM Sun / Oracle. JIT Dalvik оптимізовано для низького середовища пам’яті, і він дуже вдосконалений щодо покращення продуктивності роботи. Тож деяким збігом обставин є те, що JVM та Dalvik впроваджують подібні оптимізації для відповідних середовищ виконання Java-програм, але під кришкою вони зовсім інші.
Не забувайте того самого Дальвіка; ядро Linux; системні процеси низького рівня; і основні веб-браузери Android (як Firefox, так і Chrome) написані на рідному C / C ++, і тому вони не мають жодних проблем, що стосуються програми Dalvik. Це те саме, що iOS. Якщо ви говорите про чистий Android, а не про оператора / стороннього роздуття, який сидить поверх нього, дуже велика частка того, що складається з основного Android, не пишеться за допомогою Dalvik.
Розробники додатків на Android також можуть за своїм бажанням писати нативний код, минаючи Dalvik. Якщо розробник програми відчував, що Далвік виступає вузьким місцем у виконанні свого коду або змушує його виснажувати занадто багато акумулятора, він може просто написати C / C ++ або навіть збірний код, якщо захоче, не отримуючи дозволу Google зробити це та поширити їх додаток так.
Нарешті, я не погоджуюся з вашою оцінкою, що Android має гірші проблеми з акумулятором, ніж на інших мобільних платформах. Деякі телефони та пристрої дійсно можуть мати проблеми з акумулятором, або через ємність акумулятора відносно споживання енергії обладнання; погано оптимізовані настройки живлення (обрані користувачем, оператором або виробником); або додатки з програмним забезпеченням, які постійно підтримують чіпи в телефоні. Але для кожного прикладу пристрою, який має проблеми з акумулятором, я можу навести вам контрприклад пристрою з чудовим часом автономної роботи. Не існує простого способу узагальнити те, що "це Далвік" або "це Linux" або "це Java". Оптимізація потужності - це складний апаратний / програмний механізм, що конкурує, включаючи продуктивність, чуйність, і очікування користувачів на час автономної роботи, з плюсами і мінусами кожного вибору. Щоб повністю зрозуміти профіль живлення пристрою, вам слід уважно ознайомитися з самим акумулятором, усім обладнанням та всім програмним забезпеченням, яке працює на пристрої.