Я продолжу то, что начал в предыдущем статья работа над оптимизацией алгоритма.
Коротко расскажу, что было сделано.
Были приняты готовыми Исходники Java и каскадная модель одна из реализаций алгоритма Виола-Джонс .
Этот алгоритм используется для поиска объектов на фотографии, в частности для поиска лиц.
Я протестировал его на своем телефоне, и результаты показали, что исходный код на Java работал 54 секунды на фотографии размером 300 на 400. Это было слишком медленно, код, который я переписал на C++, показал результат 14 секунд. В комментариях было предложено догнать java-реализацию до C++ следующим образом: профилировать и найти узкие места, а двумерный массив заменить на одномерный.
У меня также были планы распараллелить алгоритм на C++.
Все сделано и исследовано, результаты ниже.
Мы представляем выпуск Java. Статистику мы берем во время работы основной части алгоритма.
Мы видим эту картинку (результат файл кому интересно):
Методы списков отнимают много времени.
В этой ситуации мы можем легко заменить все списки массивами, что и используется в C++.
Заменяем и получаем следующий результат( в файле ):
Обратите внимание на Math.sqrt, процент его выполнения увеличился с 6,7 до 13,5, а это значит, что у других сократились затраты времени, а запуск на телефоне показал 38 секунд. Остальное время уходит на примитивные методы: умножение, деление и получение элемента массива и Math.sqrt. Соответственно, я уже не вижу, где и что можно изменить, потому что.
C++ в точности повторяет код. Одномерные массивы вместо двумерных .
Давайте изменим следующий код: Теги: #android sdk #java #android ndk #C++ #распараллеливание #программирование #разработка под Android
-
Как Вы Относитесь К Сексу На Пляже?
19 Oct, 24 -
Очередной Пиар Для Шахиджаняна
19 Oct, 24