Показать сообщение отдельно
Старый 07.01.2006, 23:33   #30
jimon
 
Сообщений: n/a
по оптимизации кода у меня есть неплохая вырезка из статьи "сравнение производительности КПК и настольных систем"
там человек обяснялся почему он неприменял оптимизацию к коду

Оптимизацию можно условно разделить на 3 вида:

1.Оптимизация машинного кода.

Дело в том, что одну и ту же программу, написанную на языке высокого уровня, в данном случае на С, перевести в машинный код можно множеством способов. Вот простой пример. Допустим нам нужно поместить в регистр AX - ноль. Это можно сделать следующими способами:
1)MOV AX, 0;
2)MOV AL, 0; MOV AH, 0;
3)XOR AX, AX;
4)XOR AL, AL; XOR AH, AH;
5)XOR AL, AL; MOV AH, AL;
6)PUSH 0; POP AX.

Один из этих способов окажется быстрее. Причем, какой именно, зависит от конкретного процессора. Одни процессоры лучше работают с длинными командами, другие с короткими и т.д. А если бы мы выбрали оптимизацию на минимальный размер, то возможно выбрался бы какой-нибудь другой способ. Естественно, в реальных приложениях все много сложнее, т.к скорость выполнения зависит и от окружающих команд. Так же очень сильно на скорость выполнения влияет порядок команд (ведь часто от смены порядка нескольких соседних команд суть кода не меняется).

2. Использование специфических особенностей процессора.

Это, прежде всего, расширенные наборы команд MMX, SSE1-3 и другие (конкуренты Intel тоже не отстают в командотворчестве). Эти команды хороши, но не всесильны. Область их эффективного применения довольно ограничена. Их суть ясна из их общего названия - SIMD (Single Instruction - Multiple Data/Одна инструкция - Много данных). Другими словами, они позволяют выполнить за одну команду какое-либо действие сразу же над несколькими числами. Это достигается за счет того, что данные наборы команд работают со специальными длинными регистрами, в которые можно поместить целый набор чисел - до 16-ти. MMX предназначен для обработки целых чисел и использует регистры сопроцессора (только 64 бита), в то время, как SSE работает с вещественными числами и использует собственные 128-битные регистры. SSE2, SSE3 развивают идеи заложенные в MMX и SSE. Таким образом, данные команды хорошо подходят для алгоритмов, которые выполняют простые, однотипные действия над большим объемом данных. Причем, эти алгоритмы должны иметь поменьше условных переходов, а вычисления можно было бы "распараллелить" (т.е для каждого последующего вычисления не нужно было бы знать результат предыдущего). В качестве примеров таких задач можно привести MPEG-декомпрессию, шифрование, преобразование цветового пространства, наложение текстуры, работу с комплексными числами, быстрое преобразование Фурье, дискретное косинус-преобразование, обсчет 3-х мерных сцен. Это весьма ресурсоемкие задачи, которые постоянно встречаются при работе с мультимедийными данными и играми. Поэтому понятно, почему инженеры Intel ввели в архитектуру процессора механизмы ускорения подобных задач - имеет смысл ускорять то, что выполняется дольше всего. Задачи из моего тестового приложения очень плохо подходят для данного вида оптимизации. В них сплошные условные переходы, размерности массивов задаются переменными, вычисления не распараллеливаются, используются тригонометричекие функции.

3.Оптимизация алгоритма.

Его суть заключается в замене одного алгоритма, другим, более быстрым (или более коротким, если выбрана оптимизация на размер), но который делает тоже самое. Тоже небольшой пример. Пусть есть программа:

int a = 1;

for (int i = 0; i < 3; i++) a += i*a;

она может быть оптимизирована, например, следующим образом:

int a = 1;

a+= 0*a;

a+= 1*a;

a+= 2*a;

очевидно второй вариант будет сильно быстрее (этот метод оптимизации называется "развертывание цикла"). А более умный компилятор может вообще заменить эту программку одной строчкой:

int a = 6

или вот еще пример:

int i, j, a = 0;

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

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

a += (i*15 + j*20);

}

}

можно оптимизировать, например, так:

int i, j, k, a = 0;

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

k = i*15;

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

a += (k + j*20);

}

}

в первом случае имеем 200 операций умножения, во втором всего 110. Соответственно второй вариант сильно быстрее. (Этот метод оптимизации называется "вынос константы из цикла").

Оптимизация алгоритма - потенциально самый эффективный, но сложно реализуемый способ. Тем не менее, компиляторы пишут не один десяток лет и те примеры оптимизаций, которые я привел и даже на порядки более сложные, вполне реальны для современных средств разработки.
ето слабо относится к теме,но - здесь более мение обясняется основные принципы оптимизации при прямой трансляции кода в asm
ето очень косается блицмакса

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

тоесть нету смысла судить что выполняется быстрее
если бы вместе с кодом заново компилировалась библеотека runtime.dll то тогда бы на разных системах была заметная разница от использования разых методов, а так - пофигу

ссылка на статью : http://3dnews.ru/cpu/hpc-vs-pc/index02.htm...plate=print.htm