акробатика для программиста КРИС КАСПЕРСКИ Спецвыпуск: Хакер, номер #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 Что такое алгоритм? Почему одну задачу решить просто, другую сложно, а третью вообще никак не удается? Как создать машину, решающую задачи? Над этими вопросами ученые начали размышлять, когда еще компьютеров не было в помине. И анализ этих вопросов во многом предопределил дальнейшее развитие теории вычислений. Изучение алгоритмов и моделей будет весьма полезно тем, кто занимается практическим программированием. С одной стороны, это отличная возможность расширить кругозор и углубить понимание основных принципов и проблем компьютерной науки. С другой стороны, это реальный способ пополнить собственные инструментарий для ежедневного применения. Практика создания своего компилятора, интерпретация промежуточного кода, системы Линденмайера, машины Тьюринга и многое другое. |