#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. это не будет надежным кодом для тестирования производительности, компилятор может оптимизировать его. Я бы поискал несколько надежных фрагментов кода в Интернете.