2014-09-03 4 views
2

Я искал решение для решения как минимум 2 дня неубедительно, так как моя последняя надежда я решил задать его здесь.Android NDK vs iOS - проблема с производительностью

Здесь на работе у нас есть база данных на C++ с использованием OpenCV, которую мы хотим запускать как на iOS, так и на Android. Оказалось, что на Android все работает медленнее, и я не могу узнать причину. После профилирования мы узнали, что метод, вызывающий код C++, является проблемой, которая является точной на обеих платформах. На Android (Samsung Galaxy S4) требуется 140-150 мс, а на iOS (iPhone 5) - до 70 мс. Я прочитал несколько статей об оптимизации собственного кода и использовании разных local_cflags, но, похоже, не помог.

Это факт, который необходимо принять или есть решение? Заранее спасибо, Майк

+0

Это два разных процессора. Разница в производительности невелика, а бренд премиум-класса является более быстрым. Мне не кажется удивительным. Обратите внимание, что будут еще более медленные телефоны Android; некоторые китайские нокауты могут быть в 10 раз медленнее. – MSalters

+0

Это правда, но Galaxy S4 имеет лучший процессор в спецификациях. Похоже, это не имеет значения. – arrafutott

+1

Удостоверьтесь, что вы используете сборку armeabi-v7a, а не просто простую сборку армейцев. Простые сборки armeabi не используют FPU и, следовательно, весьма ограничены в производительности, если в коде используется много поплавков. (Для целочисленных операций разница не должна быть такой большой.) – mstorsjo

ответ

3

Ваш опыт хорошо коррелирует с моим. В моем опыте, используя OpenCV на прошивке и Android (в Nexus 4 в моем случае):

  1. Android, как правило, медленнее, если вы используете только однопоточный код. Ядро процессора Apple быстрее, чем любое ядро, которое я тестировал на телефонах Android (см. Многие обзоры телефонов в Интернете), в то время как последние телефоны Android имеют 4 или более ядра. На iOS OpenCV использует GCD для одновременного запуска нескольких алгоритмов, но на Android он не использует OpenMP (который является альтернативой, но работает только с GCC 4.x, а не Clang). К сожалению, использование OpenMP вне основного потока - боль. This bug по-прежнему присутствует в r10 NDK, так что либо вы перекомпилируете toolchain с патчами, либо застряли в основном потоке, что не является лучшим вариантом для тяжелых вычислений.

  2. OpenCV на Android по умолчанию скомпилирован с инструкциями Thumb, которые работают медленнее. Я предлагаю перекомпилировать его, устанавливая режим ARM ON, и NEON.

  3. Autovectorization flags. Если вы используете GCC на NDK, вам необходимо использовать -O3, а также -funsafe-math-optimizations, чтобы включить автообследование с помощью NEON.

  4. Дросселирование частоты процессора. Мой Nexus 4, по-видимому, с энтузиазмом снижает частоту процессора, чем iOS. Мы наблюдаем существенные колебания в таймингах кода Android, который работает с очень стабильными таймингами в iOS, и единственная причина, по которой мы можем думать, это частота процессора. Renderscript (см. this answer) максимизирует частоту процессора, но время работы от батареи будет (и вам придется переписать код).

+1

Некоторые OEM-производители (например, qualcomm) чрезвычайно агрессивны в отношении дросселирования процессора.Вы можете сказать, если это проблема, постоянно перетаскивая палец по экрану в качестве тестового запуска. Часть алгоритма заключается в том, чтобы держать часы высокими при обнаружении сенсорных обновлений, чтобы устройство чувствует себя отзывчивым при взаимодействии. Возможно, стоит обратить внимание на жесткие изменения с плавающей запятой, которые пошли в r9b (http://stackoverflow.com/questions/3004915/getting-hardware-floating-point-with-android-ndk), хотя я сомневаюсь, что вам больше 10% или около того. – fadden

+0

Я читал о неоне на нескольких сайтах, и они сказали использовать разные флагов, но, похоже, это не работало. Я что-то упускаю? Должен ли я менять свой код, чтобы получить стимул к неону? Я забыл написать, что код C++ использует 4 потока, поэтому 1) может не помочь. 2) и 3) вернули надежду, хотя я уже добавил флаг O3. Итак, вопрос в том, как работает неоновая работа? – arrafutott

+0

Не зная ничего о коде, в частности, сложно сказать, почему ваш код работает медленнее. Прошли ли какие-либо профилирования? Какие части являются самыми медленными? NEON является эквивалентом SSE/AVX на машинах x86. Это означает, что если компилятор не вектурирует ваш код для вас, вам придется сделать это самостоятельно или использовать библиотеку, которая уже имеет реализацию NEON. – user1906

Смежные вопросы