Являются ли программы, написанные на Java для Android, медленнее, чем аналогичные, написанные на C, встроенные в Objective-C для iOS? - PullRequest
16 голосов
/ 04 ноября 2011

Чтобы решить, оправданно ли начинать перенос существующего приложения iOS (написанного на C) на Android, я должен оценить, насколько быстрым оно будет, если оно будет реализовано на Java.Некоторое беспокойство вызывает тот факт, что код Java должен переводиться много раз (в байт-код, а затем в нативный код с использованием JIT).Это может отрицательно повлиять на свойства в реальном времени (отзывчивость), верно?

Как насчет качества сгенерированного кода?Это как-то сопоставимо с кодом, сгенерированным gcc / llvm?Если да, есть ли у вас ссылка на результаты сравнения (статья)?

Ответы [ 6 ]

23 голосов
/ 04 ноября 2011

Хороший вопрос.Несколько лет назад производительность Sun (теперь Oracle) JVM поблекла по сравнению с нативным кодом.Но вещи имеют изменено .

Во-первых, виртуальная машина под управлением Android не является вашей стандартной JVM.Это усовершенствованная виртуальная машина, переписанная Google специально для мобильного использования, где производительность пользовательского интерфейса имеет приоритетное значение.

Во-вторых, за последнее десятилетие произошло много событий ... цитата из это важно статья гласит: Fifteen years ago, all we thought that Java needed to rule the known universe was a faster VM. Теперь у нас гораздо более быстрая виртуальная машина.

Наконец, было много написано о сравнениях между iOS и Android с точки зрения производительности. Вот пятая ссылка только для ударов.Там гораздо больше там.Это зависит от нескольких факторов - какой тип кода вам необходим для запуска, каковы ваши ожидания в отношении производительности и сколько вы готовы инвестировать, чтобы выжать максимальную выгоду.И если вы думаете, что Dalvik - ваше узкое место, вы способны писать нативный C / C ++ и использовать JNI в Android.

4 голосов
/ 04 ноября 2011

Невозможно сравнить производительность таким способом. Ваше приложение будет работать на разных устройствах с разными характеристиками производительности. Различия в производительности между Java / Objective C, скорее всего, незначительны по сравнению с влиянием оборудования. Вы должны проанализировать узкие места вашего приложения и проверить, может ли целевое оборудование его поддерживать. Если это реализовано в Java, не имеет большого значения.

2 голосов
/ 31 августа 2012

В качестве теста я однажды написал тестовое приложение, которое выполняло алгоритм сортировки для большого случайного списка.

Версия C работала примерно в 10 раз быстрее, чем та же версия Java.

Я подозреваю, что Java обычно работает примерно в 5 раз медленнее, чем эквивалентный C на той же платформе.

Платформа, на которой она работает, также будет влиять на скорость.

1 голос
/ 04 ноября 2011

Android Java не совсем интерпретируется так, как вы думаете.На самом деле байт-код Java даже не попадает на устройство, потому что dalvik VM (Android-JVM) не интерпретирует байт-код Java, а выполняет байт-код DEX, который ближе к собственному формату процессора.Так что действительно трудно «угадать» или экстраполировать разницу в производительности между Objective-C и Android на расстоянии вытянутой руки, основываясь только на том, что один - это Java, а другой - нативный код.Не говоря уже о том, что у вас есть свои ОС для сравнения: вариант Linux и ядро ​​Mach.Тогда Android не отображает программы на процессы так же, как iOS.Учитывая различия в языке, ОС, системном отображении и вариациях базового кода SDK, вы действительно не сможете решить, не поработав немного на вашей стороне, если у вас возникнут проблемы с производительностью или нет.Но это действительно не должно иметь значения, потому что, если есть спрос и потребность в вашей программе на Android, рыночные силы должны быть куда более убедительными, чем проблемы с производительностью.Вы знаете старую поговорку «Если это действительно важно для вас, вы найдете способ. Если нет, вы найдете оправдание».

1 голос
/ 04 ноября 2011

Решение о портировании на другую платформу обычно принимается бизнесом, а не инженером.Что касается скорости - это зависит.Между тем JIT имеет тенденцию быть действительно быстрым, и он использует некоторые оптимизации во время выполнения, которые недоступны для скомпилированных программ на Си.

Тем не менее, невозможно предсказать, какие потери или преимущества могут возникнуть из-за портирования, не зная, что делает ваша программа.приложение - его производительность будет зависеть от аппаратного обеспечения и будет предсказуемым.

1 голос
/ 04 ноября 2011

Даже если вы не заботитесь об этом, да, байт-код Java может быть немного медленнее.Если вы полностью беспокоитесь о производительности, вы можете использовать NDK и написать большую часть приложения на C (++).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...