Являются ли программы, написанные на Java для Android медленнее, чем эквивалентные, написанные на C, встроенные в Objective-C для iOS?
Чтобы решить, стоит ли начинать портирование существующего приложения iOS (написанного на C) на Android, я должен оценить, насколько это будет быстро, если он будет реализован на Java. Некоторая озабоченность вызывает тот факт, что Java-код должен многократно переводиться (на байт-код, а затем на родной, используя JIT). Это может повлиять на свойство реального времени (отзывчивость) отрицательно, не так ли?
Как насчет качества сгенерированного кода? Это как-то сопоставимо с gcc/llvm сгенерированным кодом? Если да, есть ли у вас ссылка на результаты сравнения (документ)?
Ответы
Ответ 1
Хороший вопрос. Несколько лет назад производительность Sun (теперь Oracle) JVM была бы бледна по сравнению с собственным кодом. Но вещи имеют изменено
.
Во-первых, виртуальная машина под управлением Android не является вашей стандартной JVM. Его расширенная виртуальная машина, переписанная Google специально для мобильных устройств, где приоритет имеет пользовательский интерфейс.
Во-вторых, за последнее десятилетие многое произошло... цитата из эта соответствующая статья гласит: Fifteen years ago, all we thought that Java needed to rule the known universe was a faster VM.
Мы теперь имеют намного более быструю VM.
Наконец, было много написано о сравнении iOS и Android с точки зрения производительности. Вот пятая ссылка только для пинков. Там гораздо больше. Это сводится к нескольким факторам - какому типу кода вам нужно управлять, каковы ваши ожидания в отношении производительности и сколько вы готовы инвестировать, чтобы выжать больше всего за ваш доллар. И если вы считаете, что Dalvik - это ваше узкое место, вы можете писать собственный C/С++ и использовать JNI в Android.
Ответ 2
В качестве теста я однажды написал тестовое приложение, которое выполнило алгоритм сортировки в большом случайном списке.
Версия C работает примерно в 10 раз быстрее, чем та же Java-версия.
Я подозреваю, что вы, как правило, увидите, что Java работает примерно в 5 раз медленнее, чем эквивалент C на той же платформе.
Платформа, на которой он работает, также будет влиять на скорость, конечно.
Ответ 3
Вы не можете сравнивать производительность таким образом. Ваше приложение будет работать на разных аппаратных средствах с различными характеристиками производительности. Различия в производительности между java/цель c наиболее вероятно незначительны по сравнению с влиянием аппаратного обеспечения. Вы должны проанализировать узкие места вашего приложения и проверить, поддерживает ли его целевое оборудование. Если он реализован в java, это не имеет большого значения.
Ответ 4
Даже если вам не все равно, да, байт-код Java может быть немного медленнее. Если вы полностью беспокоитесь о производительности, вы можете использовать NDK и написать большую часть приложения в C (++).
Ответ 5
Решение о том, следует ли переносить на другую платформу, обычно происходит с деловой стороны, а не с инженерной. Что касается скорости - это зависит. Тем временем JIT имеет тенденцию быть очень быстрым, и он использует
некоторые оптимизации во время выполнения, которые недоступны для скомпилированных программ C.
Тем не менее, невозможно предсказать, какие нарушения производительности или преимущества могут возникнуть в результате переноса, не зная, что делает ваша программа.
И есть возможность пойти с собственным C-кодом, доступ к которому осуществляется из приложения Android - его перфоманс будет зависеть от аппаратного обеспечения и быть предсказуемым.
Ответ 6
Android Java точно не интерпретируется, как вы думаете. На самом деле байт-код Java даже не делает это на устройстве, потому что dalvik VM (android JVM) не интерпретирует байт-код Java, он запускает байт-код DEX, который ближе к собственному формату процессора. Так что действительно сложно "угадать" или экстраполировать разницу в производительности между Objective-C и Android на длине вооружения, основанной только на знании, это Java, а один - собственный код. Не говоря уже о том, что у вас есть своя ОС для сравнения: Linux вариант против ядра Mach. Тогда Android не отображает программы в процессы так же, как и iOS. Учитывая различия в языке, ОС, системном сопоставлении и вариациях в базовом SDK-коде, вы действительно не можете решить, не делая небольшой работы на своей стороне, если у вас возникнут проблемы с производительностью или нет. Но это действительно не имеет особого значения, потому что, если спрос и потребность в вашей программе на Android, рыночные силы должны быть более привлекательными, чем проблемы с производительностью. Вы знаете старую поговорку: "Если это действительно важно для вас, вы найдете способ. Если нет, вы найдете оправдание".