2011-03-25 2 views
1

Я пишу сложные алгоритмы обработки изображений для iPhone с помощью Xcode4 и официального SDK. Мне нужно много раз вычислять квадраты в моем коде, всегда для unsigned char x. Таким образом, чтобы сделать это быстрее, я объявил таблицу:x * x versus table_of_sqr [x] = нет разницы?

int table[255] = {0, 1, 4, 9,... }; 

и вместо

int sqr = x * x; 

Я получаю значение из этой таблицы

int sqr = table[ABS(x)]; 

К сожалению, когда я профилирование мое приложение в симуляторе iPhone, это говорит мне, что эта одна строка (получение значения из таблицы) занимает более 50% времени выполнения приложения, поэтому это не является большим улучшением по сравнению с вычислениями sqr в любое время. Что я делаю неправильно? Это должно быть намного быстрее, но я могу ошибаться, я новичок в этой среде программирования.

+0

Заменены все квадратные корнеплоды квадратами. – paxdiablo

ответ

4

Во-первых, вы не вычисляете квадратный корень, вы просто вычисляете квадрат, значительно менее дорогостоящую операцию. Во-вторых, если ваш компилятор не умен с кешированием или постоянным распространением, поиск в памяти обычно дороже, чем операция квадратизации.

Почему вы решили оптимизировать эту строку изначально? Профилировали ли вы и решили, что старый способ сделать это был недостаточно эффективным/быстрым?

+0

Да, я вычисляю квадраты, как я уже говорил. Это был только пример того, что я пытаюсь вычислить. В моем коде я вычислил немного более сложное уравнение: s = (x/3) *^2 для x между -765 и 765. Я должен делать это много раз, и профайлер говорит мне, что это занимает много времени выполнить. Поэтому я решил объявить таблицу с предварительно вычисленными значениями для x между 0 и 765. – Darrarski

0

Это, вероятно, не быстрее. У большинства ЦП есть операция с одним циклом для умножения целых чисел, где в качестве поиска массива подразумевается операция, которая требует гораздо более медленного доступа к памяти.

+0

В настоящее время мои модификации делают время выполнения этого уравнения примерно на 5% короче. Но это не огромное улучшение. Я читал во многих книгах, даже в stackoverflow, что подготовка таблицы с предварительно вычисленными значениями является хорошим решением для быстрого создания «SQRT». – Darrarski

0

Xcode может показывать Asm. Посмотрите на код языка ассемблера, и вы, скорее всего, обнаружите, что для доступа абс и индексированного массива требуется несколько команд ARM, чем простое умножение.

+0

К сожалению, я не так хорошо читаю или даже перепроектирую код Ассемблера. Но я уже заменил инструкцию ABS() с if ((x >> 31) == -0x01) {... -1 * x ...} else {... x ...} – Darrarski

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