Pull to refresh

Android NDK vs SDK vs iPhone

Reading time2 min
Views4K

Окружение


Будем писать на MacOS, так как кармическая коала пока «пробуждается».
Eclipse Galileo, Android SDK 1.6r1 & NDK 1.6r1, установлены и настроены.
Писать будем на NDK 1.5, потому что на руках доступен только HTC Magic(32A).
Данное тестирование написано с целью «прощупать» почву, перед портированием игры с айфона на андройд.

Тестирование


В качестве тестов были взяты следующие варианты:
  • Быстрая сортировка
  • Сортировка Шелла
  • Переворот массива
  • Вызов метода
  • Метод половинного деления

Почему выбор именно такой?
«Метод половинного деления», для уравнения Y=3*cos(2*x-4) в интервале (-10;10) с точностью 10^(-15), был выбран,
так как в устройстве нет сопроцессора для ускорения расчетов с плавающей точкой, поэтому интересно было посмотреть даст ли переход с Java на JNI выигрыш в работе. Другое дело — это большие объемы данных и большое количество вызовов «методов». Для проверки рекурсии в купе с большим объемом данных была взята быстрая сортировка, для исключения рекурсии взят алгоритм Шелла. Для проверки производительности работы конкретно с данными, используем переворот массива.
Для оценки затрат на вызов JNI и Java «метода», вызовем 10000 раз методы пустышки.
Для сортировки используем массив int из 10000 элементов, заранее сформированный.
Результаты были получены для симулятора(2.4GHz Intel Core 2 Duo), HTC Magic(32A, 1.5, ядро 2.6.29+bfs), а так же для iPhone3G(3.1). Все тестовые методы были написаны на чистом С.

Результаты


Симулятор


- QS SS Swap Div2 Empty
JNI(sim) 10590 253735 699 210339 13895
JAVA(sim) 100650 4573416 7861 334483 7745
Sim % 89,48 94,45 91,11 37,12 -79,41

* % — показывает на сколько процентов быстрее работает JNI от Java

HTC Magic(32A 1.5, 2.6.29-myhero-bfs)


- QS SS Swap Div2 Empty
JNI 7469 117139 880 109197 8885
JAVA 63569 2902912 5959 213278 5193
% 88,25 95,96 85,23 48,8 -71,1

* % — показывает на сколько процентов быстрее работает JNI от Java

Время для Android платформы снималось с помощью функции java.lang.System.nanoTime(), для iPhone с помощью mach_absolute_time().
Каждый тест запускался 30 раз, результат усреднялся. Первый результат пропускался, так как он выбивался из общего показателя, видимо связано со спецификой Java.
Как видно из результатов, NDK очень эффективен при работе с большими объёмами данных, большой прирост так же наблюдается и при переносе «математики» в JNI, единственный минус — это «цена» вызова.
Симулятор
Симулятор
HTC Magic
HTC Magic
А теперь сравним с айфоном, ждать чудес не стоит…

iPhone


- QS SS Swap Div2 Empty
HTC Magic JNI 7469 117139 880 109197 8885
iPhone 33531 1310358 1820 22405 769
% 77,73 91,06 51,65 -387,38 -1055,4

* % — показывает на сколько процентов быстрее работает Magic от iPhone

На диаграмме не представлен Метод половинного деления, так как заведомо известно что айфон с его сопроцессором ускорения математики с плавающей точкой, просто разгромит Magic, что мы и видим по результатам. Методы пустышки тоже убраны, так как компилятор iPhone хорошо оптимизирует «такой код».
iPhone
Результаты меня просто поразили. Проигрыш только в математике и оптимизации кода. Думаю с выходом новых устройств первую проблему решат.

Исходники тестов для iPhone и Android.
P.S. как только будет возможность поставить прошивку 1.6 на телефон, проведу сравнение OpenGL.
Tags:
Hubs:
Total votes 12: ↑7 and ↓5+2
Comments6

Articles