Производительность Android NDK по сравнению с обычным кодом Java

#java #android #performance #java-native-interface #android-ndk

#java #Android #Производительность #java-native-interface #android-ndk

Вопрос:

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

Типичными хорошими кандидатами для NDK являются автономные операции с интенсивным использованием процессора, которые не выделяют много памяти, такие как обработка сигналов, физическое моделирование и так далее. Простое перекодирование метода для запуска на C обычно не приводит к значительному увеличению производительности.

Мой алгоритм обработки сигналов (адаптивный фильтр, если вы знакомы), требующий больших вычислительных затрат с миллионами линейных операций (не могу показать код, но миллионы линейных операций в значительной степени подводят итог). Когда я реализую один и тот же код с помощью JNI и Java, я практически не получаю прироста производительности. На самом деле, это занимает точно такое же количество времени в любом случае, в пределах неопределенности, так что теперь я не уверен, стоит ли мне просто использовать Java для всего остального. Для сравнения, им обоим требуется ~ 8 секунд для завершения задачи.

Существуют ли какие-либо лучшие критерии того, когда алгоритмы, реализованные в JNI, работают быстрее, чем Java? Есть ли у кого-нибудь пример, в котором производительность была действительно заметной?

Ответ №1:

например: суммируйте натуральное число от 1 до 1 000 000. код выглядит следующим образом:

 unsigned int sum = 0;
for(int i = 1; i <= 1000000;   i) {
    sum  = i;
}
  

если приведенный выше код закодирован на Java, время заняло, возможно, около 200 мс.
Но при кодировании c в jni время занимало всего около 30 мс.
Вы можете попробовать.

Комментарии:

1. это не будет надежным кодом для тестирования производительности, компилятор может оптимизировать его. Я бы поискал несколько надежных фрагментов кода в Интернете.