Являются ли приложения для iOS быстрее приложений для Android, поскольку приложения для Android интерпретируются?

31

Приложения для Android интерпретируются, а не компилируются. Делает ли это их медленнее, чем приложения iOS во время выполнения?

Армон Сафай
источник
14
Это не очень хороший вопрос, потому что приложения для Android не интерпретируются, как указывает правильный ответ.
Aaronaught
2
Обычно принятый ответ, не являющийся лучшим ответом, не является большой проблемой, так как цель состоит в том, чтобы помочь тому, кто задал вопрос (см. Этот мета-пост). Но это довольно экстремальный случай @ArmonSafai Ответ, который вы выбрали как правильный, полон дезинформации, и он уже не может быть исправлен. Пожалуйста, рассмотрите возможность выбора другого ответа.
Селали Адобор
Обратите внимание, что некоторые крупные корпорации, в том числе IBM, в настоящее время пишут основные приложения на Java. Учитывая JIT-компилятор Just-In-Time, который является стандартной частью современной Java VM, производительность действительно сопоставима с любым другим языком высокого уровня. Много лет Ява была не только «интерпретируемым языком».
Кешлам
JIT-компиляторы вообще не связаны с концепцией JVM. Есть JVM, которые не используют JIT-компиляторы, даже коммерческие. Некоторые варианты JVM от IBM не включают JIT по умолчанию, вместо этого по умолчанию используется компиляция AOT. Кроме того, небольшая заметка: «Основные приложения в Java в наши дни» были, вероятно, более подходящими полтора десятилетия назад (IBM добавлял в Java до 1997 года)
Selali Adobor
Вопрос несколько вводит в заблуждение. «Нативное» iOS-приложение написано на Objective-C (или Swift) и скомпилировано, тогда как «стандартное» Android-приложение написано на Java и скомпилировано в байт-код. Смотрите ответ @ DanHulme. Но можно написать приложения для любой платформы на HTML и JavaScript, используя, например, PhoneGap / Cordova. Приложение HTML обычно воспринимается как более медленное, чем собственное приложение на той же платформе. Так что если подобное приложение для «другой» платформы кажется медленным, возможно, это потому, что оно было создано с использованием другой технологии.
Дэвид

Ответы:

85

Java не интерпретируется на Android. Приложения Android скомпилированы разработчиком в байт-код . Байт-код представляет собой компактное представление программы: он меньше исходного кода, написанного программистом, но все еще не исполняется непосредственно процессором. На этом этапе можно выполнить некоторые оптимизации, такие как удаление мертвого кода.

Когда вы загружаете приложение на устройство, JVM Dalvik компилирует байт-код в собственный исполняемый код, как только он собирается работать. Это сборник точно в срок . Это приводит к небольшому замедлению, пока программа ожидает компиляции, но после этого производительность не снижается, поскольку код был скомпилирован в собственный исполняемый код.

Есть некоторые преимущества в производительности, если вы делаете это таким образом, вместо того, чтобы предварительно компилировать его на компьютере разработчика. Приложение может быть скомпилировано для конкретного процессора на телефоне, используя его аппаратные функции и характеристики производительности. Например, он может использовать аппаратные операции с плавающей запятой, если его поддерживает ЦП. Кроме того, умный JIT-компилятор (по общему признанию, Dalvik не совсем такой умный) может следить за тем, как работает программа, и выполнять оптимизацию в зависимости от того, как программа используется в реальном использовании. Он может перекомпилировать код с лучшей подсказкой ветки, как только увидит, какие параметры включены и выключены в вашей среде на вашем телефоне. Открытый компилятор не имеет этой информации для использования.

Dalvik использует кеш Dalvik и другие методы, чтобы уменьшить недостатки компиляции JIT. Новая JVM для Android L и более поздних версий, ART, полностью заменяет JIT опережающим компилятором. Это компилирует байт-код в собственный исполняемый код, когда приложение установлено, чтобы получить большинство преимуществ JIT без задержки загрузки приложения.

Не забывайте, что приложения для Android не полностью состоят из Java. Разработчики имеют NDK для написания всех или части своих приложений на C или C ++ для критически важных частей приложения, особенно для игр. Специальные интерфейсы, такие как OpenGL и Renderscript, позволяют программистам использовать специальные аппаратные средства, такие как GPU и SIMD-сопроцессор, для некоторых видов вычислений.

Так что на самом деле, нет простого ответа на ваш вопрос. Использование JIT вместо предварительной компиляции делает некоторые вещи быстрее, некоторые медленнее. Это всего лишь часть общей производительности ОС.

Дэн Халм
источник
1
+1 за отличное объяснение. Я действительно ждал такого ответа.
MANI
5
На самом деле, мало чем отличается от утомительных старых дебатов о производительности .NET / Java или C ++ на ПК. Это яблоки и апельсины.
Аарона
1
@ArmonSafai Совершенно верно.
Дэн Халм
2
@MTilsted: Это отчасти верно, но он кэширует почти все, так что вы говорите, скорее всего , только в том случае самый первый раз , когда вы запускаете приложение.
Аарона
1
Главная проблема здесь в том, что Dalvik представляет собой «нормальную» JVM. Между основанным на регистрах, в отличие от основанного на стеке, как HotSpot (из-за природы процессоров ARM против тех, на которые ориентирован HotSpot [например, IA32]), это использование Zygote и концепция файлов odex (то есть вся идея не [более или менее] переходя прямо от файла класса к загрузчику классов), обработка Dalvik как обычной JVM неизбежно приведет к некоторым заблуждениям. Тем более, что многие детали реализации HotSpot часто ошибочно связаны с JVM в целом (например, это JIT-компилятор).
Селали Адобор
2

Так как это широкий вопрос, вот широкий ответ.

«Являются ли приложения для iOS быстрее, чем приложения для Android, поскольку приложения для Android интерпретируются?»

Во-первых, приложения для iOS не «быстрее, чем» приложения для Android.

Во-вторых, что касается вопроса «Приложения для Android интерпретируются». Это то, что вы бы сказали о вычислительной технике, например «15 лет назад»: как вы можете видеть из приведенного выше обсуждения, сегодня ситуация намного сложнее; совершенно новые технологии вышли на первый план. Концепция "скомпилировано быстрее, чем интерпретируется!" было уместно сравнивать perl с машинным кодом 20 лет назад; Ситуация настолько изменилась, что сегодня эта проблема не может быть четко применена к «iOS V Android».

В-третьих, в мобильном программировании есть и другие проблемы, которые полностью перекрывают подобные соображения. Лишь один пример на местах, мобильные программисты не справляются с обработкой больших прокручиваемых списков изображений, отложенной загрузкой и аналогичными проблемами. То, как две ОС и различные популярные библиотеки решают эти критические проблемы, часто затопляет другие проблемы.

В-четвертых, еще одна серьезная проблема мобильных телефонов - это проблемы графического чипсета и различных сложных взаимосвязей этого с программным обеспечением, OpenGL и так далее. Например, Apple выпускает систему, которую они называют «Металл» в связи с этими проблемами, а Android выпускает собственную «штуку» в этой области. Эти проблемы, связанные с графическим конвейером, чрезвычайно важны для того, как приложения «чувствуют» себя в руке.

Очень краткий ответ на ваш вопрос «составленный V. интерпретированный» - это, по сути, устаревший вопрос для обсуждения, вы знаете?

(Кроме того, я не нахожу Note3 более «медленным», чем iPhone. Кроме того, отчасти это чистый артефакт - существуют недорогие телефоны Android: просто не производятся низкопроизводительные айфоны, поэтому некоторые люди могут ошибаться идеи из этого.)

Fattie
источник
-3

Потому что интерпретируемые приложения не означают, что они всегда медленные. Иногда они более мощные и динамичные по сравнению с компилируемыми. Поскольку все коды в скомпилированном приложении компилируются один раз, а выходные данные сохраняются в виде библиотек или исполняемых файлов, в то время как на интерпретированном языке один раз можно произвольно изменить последовательность выполнения. Таким образом, я могу сказать, что это зависит от разработчика до разработчика и от способа программирования.

Однако Java (язык программирования Android) не интерпретируется, а компилируется JIT. Это означает, что программы для Android компилируются непосредственно перед тем, как вы их запускаете, обеспечивая производительность, аналогичную для iOS Objective C.

В последнее время Android ART Framework предварительно компилирует приложения, поэтому они запускаются так же, как приложения для iOS. Другими словами, следующая версия Android, вероятно, будет такой же быстрой, как и iOS.

Обновить

Языки программирования обычно делятся на две категории: скомпилированные или интерпретированные. В случае скомпилированного языка вводимый код сокращается до набора машинно-специфических инструкций перед сохранением в виде исполняемого файла. В интерпретированных языках код сохраняется в том же формате, в котором вы ввели. Скомпилированные программы обычно работают быстрее, чем интерпретируемые, потому что интерпретируемые программы должны быть сведены к машинным инструкциям во время выполнения. Однако с помощью интерпретируемого языка вы можете делать то, что нельзя делать на скомпилированном языке. Например, интерпретируемые программы могут изменять себя, добавляя или изменяя функции во время выполнения. Также обычно легче разрабатывать приложения в интерпретируемой среде, поскольку вам не нужно перекомпилировать приложение каждый раз, когда вы хотите протестировать небольшой раздел.

См-Sharp
источник
1
то , что вы имеете в виду «когда - то может случайно изменить последовательность выполнения И как они более мощным и динамичным Также им не говорят , что Theyre медленно, так что они медленнее, даже немного?.
Армон Safai
3
Это не совсем так. Неправильно утверждать, что отсутствие необходимости перекомпиляции является преимуществом, поскольку вам все еще необходимо создать файл APK и развернуть его на тестовом устройстве. Google не решил использовать Java: Android уже был основан на Java до того, как Google купил его. Файлы APK не содержат код «в том же формате, в котором [программист] ввел».
Дэн Халм
1
Microsoft .NET компилируется в код IL, который также интерпретируется так же, как Java компилируется в байт-код.
Эсбен Сков Педерсен
12
Много информации в этом ответе на самом деле не актуально или технически правильно. Я бы честно предложил этот ответ полностью пересмотреть с точки зрения технической точности.
Аза
2
Java обычно не интерпретируемый язык , если вы не имеете дело с необычной реализацией JVM. Компиляция JIT - это не то же самое, что интерпретатор, поэтому большая часть этого ответа, честно говоря, довольно неактуальна в контексте производительности Android, поскольку она использует JIT.
eldarerathis