Написал небольшое приложение под андроид, но там приличная «математика» плюс работа с битмапом. На Java расчет идет очень долго. Для сравнения, на десктопе (2.5 ГГц) обычная с++ версия считает задачу 3 секунды, на том же декстопе java-android в эмуляторе задача считается 2 минуты.
В связи с этим возникает вопрос. Есть ли смысл извращаться с с++ под андроидом, будет ли прирост в скорости «математики», примерно какой?
Спасибо.
В вашей версии Android используется JIT-компилятор? Вроде бы он появился с версии Android 2.2.
С JIT-компилятором идентичные программы (на сколько это позволяют языки) будут выполняться примерно с одинаковой скоростью.
Но с другой стороны, извращения на С++ и вставки на ассемблере позволяют увеличить производительность программы на порядок (и на порядок увеличить количество проблем у программиста)
Напишу сам ответ. Все-таки для определенного круга задач лучше использовать с++. Работа с NDK далась оооочень непросто, особенно в тандеме с нетбинсом. Но в итоге время счета на эмуляторе не на много превышает время счета в обычном десктопном приложении.
Я бы написал небольшой и очень простой этюд, на котором посмотрел реальный прирост скорости на С++.
Если прирост достаточно большой (каждый сам определяет меру), то стал бы писать на С++.
Смотря какой у вас код. По большому счету оверхед может быть за счет работы с массивом разве только, ну или со самой bitmap.
В чистой математике прироста скорости существенного вы не получите без изменения алгоритма.
Плюс еще не забывайте вам нужно даныне будет передвать в jni слой — это тоже время.
Что у вас занимает в расчетах наибольшее время? Какая функция является bootle neck — приведите ее, тогда можно будет оценить будет ли выигрыш.
В двух словах — по битмапу строится Vector объектов класса (размером с количество пикселей) и затем с ним производится работа (матвычисления), берется i-тый элемент, всего его соседи (прыжки по контейнеру). Нечто похожее на бикубическую интерполяцию. Собственно я подозреваю что узкое место это именно работа с контейнером. В с++ версии это делается на stl. В целом код портировался строка в строку, логика сохранена, потому грешу именно на контейнеры.
По вектору пробегаю по интераторам (it.next()), выбор соседей из вектора — по get(i).
В таком случае действительно может быть выигрыш по скорости. Но я бы в первую очередь поигрался бы со структурами данных — пока не совсем понятно насколько реально там нужен вектор, почему бы просто не работать со статического размера массивами.
Надо не подозревать, а померить профилировщиком что тормозит, вычисления или чтение. Кстати, вместо Vector попробуй ArrayList или Array просто т.к. Vector синхронизирует операции чтения и записи.