Влияние Дальвика на производительность нативного кода C ++? - PullRequest
2 голосов
/ 10 февраля 2012

Я планирую использовать Necessitas для переноса кода Qt на платформу Android. На первый взгляд, я заметил, что несмотря на то, что он является нативным кодом, все проходит через виртуальную машину Dalvik.

Мой вопрос - это накладные расходы? Для начала Java менее эффективен, чем нативный c ++, а Dalvik довольно незрелый по сравнению с ванильной Java, которая вызывает у меня беспокойство.

1 Ответ

5 голосов
/ 10 февраля 2012

В документации Android вы можете найти следующий совет:

Собственный код не обязательно более эффективен, чем Java. Для одной вещи, есть стоимость, связанная с нативным переходом Java, и JIT не может оптимизировать через эти границы. Если вы выделяете родной ресурсы (память в собственной куче, файловые дескрипторы или что-то еще), может быть значительно сложнее организовать своевременный сбор эти ресурсы. Вы также должны скомпилировать свой код для каждого архитектура, на которой вы хотите работать (вместо того, чтобы полагаться на нее с JIT). Возможно, вам даже придется собрать несколько версий для того, что вы считаете та же архитектура: нативный код, скомпилированный для процессора ARM в G1 не может в полной мере использовать ARM в Nexus One, и код скомпилированный для ARM в Nexus One не будет работать на ARM в G1.

Грубо говоря, код Dalvik медленнее, чем чистый C / C ++, оптимизированный для платформы. Но связь между собственным кодом и кодом Java происходит через JNI, который является основным источником накладных расходов.

Так что ответ на ваш вопрос - да, JNI вводит дополнительные накладные расходы. Но если вы хотите портировать существующий код C / C ++, ndk - лучший выбор в вашем случае.

...