Окружение
Будем писать на 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
А теперь сравним с айфоном, ждать чудес не стоит…
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 и Android.
P.S. как только будет возможность поставить прошивку 1.6 на телефон, проведу сравнение OpenGL.