В последнее время я экспериментировал с NDK, потому что пользовательский интерфейс нуждался в эффективной реализации алгоритма с интенсивными вычислениями. В документации NDK указано:
Типичными хорошими кандидатами для NDK являются автономные операции с интенсивной загрузкой процессора, которые не выделяют много памяти, такие как обработка сигналов, физическое моделирование и т. Д. Простое перекодирование метода для запуска на C обычно не приводит к значительному увеличению производительности.
Mine - это алгоритм обработки сигналов (адаптивный фильтр, если вы знакомы), вычислительно-интенсивное вычисление с миллионами линейных операций (не может показать код, но миллионы линейных операций в значительной степени подводят итог). Когда я реализую тот же код с JNI и Java, я практически не получаю прироста производительности. Фактически, это занимает одинаковое количество времени в любом случае, в пределах неопределенности, поэтому теперь я не уверен, следует ли мне просто использовать Java для всего остального. Для сравнения, им обоим требуется ~ 8 секунд на выполнение задачи.
Есть ли лучшие критерии того, когда алгоритмы, реализованные в JNI, работают быстрее, чем Java? Есть ли у кого-нибудь пример, на котором действительно была заметна производительность?