Как стать автором
Обновить

Комментарии 15

Интересно, конечно, но необходимость переписывания на C++ по статье оценить сложно.

Вы профилировали Java-версию? Не было видно узких мест?
На эмуляторе с Android 5 и средой Dalvik не запускали?

И, если, можно покажите исходники C++ и Java версии

Средой ART имелось ввиду?
Исходники приложил в конце статьи. Сначала хотел сделать профилирование, но «на глаз» не обнаружил узких мест, но, думаю, что займусь этим, т.к. самому очень интересно. Для эмуляции использовался Android 4.3.1, ART не использовал. Боевое устройство на Android 4.3.
Мне кажется, что это все равно очень плохой результат и стоит смотреть в первую очередь реализацию алгоритма, без привязки к языку.
Что сразу бросилось в глаза — использование двумерного массива для работы с изображением. Это сильный удар по производительности и я считаю, что в таких алгоритмах следует использовать одномерную структуру.
Имеется ввиду использовать вместо array[i][j] вот тако array[i * width + j]?
Да, в Java array[i][j] — это именно массив массивов. Который будет создавать N+1 массив для матрицы размерности N. В Си это, насколько я знаю, это не так принципиально.
Именно так. В Android, например, все битмапы внутри содержат одномерный массив пикселей.
Вы будете удивлены, на сколько быстрее обрабатывается одномерное представление.

Вообще, метод Виолы-Джонса рассчитан на использование в реал тайме, так что вы должны понимать, что ваша реализация уж очень сильно проседает по производительности.
Не первый раз уже вижу статьи о том как люди «переписывают Java алгоритмы на C++», при этом говоря, что алгоритм ускорился в 5, в 10, в 100 раз. Вот только я ни в одной этой статье не наблюдал, чтобы автор профилировал исходный Java код.

«На Java алгоритм медленно работает, перепишу-ка я его на C++» — не правильный подход. Как по мне, разумнее найти проблемы именно в Java части, быть может их довольно просто пофиксить.
Обязательно отпрофилирую, тем более уже вижу к чему как минимум стремиться.
Да, наверное. С другой стороны, если есть внутренняя неэффективность самого алгоритма, то она перейдет и в С++ версию. Хотя, например, вынести все локальные reference-переменные методов выше в класс надо было, конечно (исходники не смотрел, но это обычно очень большой замедлитель сложных численных алгоритмов на Джаве).
Я вот прямо чувствую, что переписав парсер XML (на использование того же SAX), уже можно догнать и перегнать C++. Не говоря уж о том, что и как можно сделать, если оптимизировать java-код.
Да, парсер здесь не быстрый, омобенно это заметно на виртуальном устройстве. Парсер в замере скорости не участвовал, предполагается, что он один раз инициализируется.
А не могли бы вы выложить проект полностью, чтобы можно было его рррраз, и собрать, а не играть в настраивание билда? Хочется на досуге попытаться его оптимизировать без влезания в нативный код.
Весь проект выложить не могу, там секретные коды:)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории