Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #71, ОКТЯБРЬ 2006 г.

акробатика для программиста

КРИС КАСПЕРСКИ

Спецвыпуск: Хакер, номер #071, стр. 071-056-7


Вот еще один пример, демонстрирующий оптимизацию цикла с тройной вложенностью:

неоптимизированный кандидат на регистровую ре-ассоциацию

int a[10][20][30];

void example (void)

{

int i, j, k;

for (k = 0; k < 10; k++)

for (j = 0; j < 10;j++)

for (i = 0; i < 10; i++)

a[i][j][k] = 1;

}

Для достижения наибольшей производительности код следует переписать так (разворот циклов опущен для наглядности):

оптимизированный вариант — счетчик цикла совмещен с указателем на массив

int a[10][20][30];

void example (void)

{

int i, j, k;

register int (*p)[20][30];

for (k = 0; k < 10; k++)

for (j = 0; j < 10; j++)

for (p = (int (*)[20][30]) &a[0][j][k], i = 0; i < 10; i++)

*(p++[0][0]) = 1;

}

[шаг в будущее.]

Собирать свою коллекцию «как надо и как не надо оптимизировать программы» мыщъх начал уже давно (здесь приведена лишь крошечная ее часть). Время шло, компиляторы совершенствовались, и все больше примеров перемещалось из первой категории во вторую. А затем... разработчики компиляторов поутихли, и со временен Microsoft Visual C++ 6.0 новых рывков что-то не наблюдается, поэтому у статьи есть все шансы сохранить свою актуальность в течение нескольких лет. А, возможно, и нет.

ОЗОР КНИГ

Классика программирования: алгоритмы, языки, автоматы, компиляторы. Практический подход — СПб.: Наука и Техника, 2006 / Мозговой М.В. / 320 страниц Разумная цена: 197 рублей

Уровень: MEDIUM

Что такое алгоритм? Почему одну задачу решить просто, другую сложно, а третью вообще никак не удается? Как создать машину, решающую задачи? Над этими вопросами ученые начали размышлять, когда еще компьютеров не было в помине. И анализ этих вопросов во многом предопределил дальнейшее развитие теории вычислений. Изучение алгоритмов и моделей будет весьма полезно тем, кто занимается практическим программированием. С одной стороны, это отличная возможность расширить кругозор и углубить понимание основных принципов и проблем компьютерной науки. С другой стороны, это реальный способ пополнить собственные инструментарий для ежедневного применения. Практика создания своего компилятора, интерпретация промежуточного кода, системы Линденмайера, машины Тьюринга и многое другое.

Назад на стр. 071-056-6  Содержание