Производительность Android NDK по сравнению с обычным кодом Java - PullRequest
5 голосов
/ 08 июня 2011

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

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

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

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

1 Ответ

1 голос
/ 08 июня 2011

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

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

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

...