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

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

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

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

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


person Phonon    schedule 08.06.2011    source источник


Ответы (1)


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

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

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

person ameyume    schedule 08.06.2011
comment
это не будет надежным кодом для проверки производительности, компилятор может это оптимизировать. Я бы поискал в Интернете несколько надежных фрагментов кода. - person Özgür; 23.06.2011