Память процессора... Как обратиться? Заполнить? Освободить?
Модератор: Модераторы
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
Re: Память процессора... Как обратиться? Заполнить? Освободи
ещё один тролль... Что-то их много стало на форуме последнее время...
Re: Память процессора... Как обратиться? Заполнить? Освободи
Brainenjii писал(а):ещё один тролль... Что-то их много стало на форуме последнее время...
Это наш художник. Единственный и неповторимый
Re: Память процессора... Как обратиться? Заполнить? Освободи
Лучше скажите, что будет работать быстрее, с точки зрения оптимизации???:
вариант №1
for i := 0 to 1000000000 do a[i] := i;
for i := 0 to 1000000000 do b[a[i]] := i;
for i := 0 to 1000000000 do c[b[a[i]]] := i;
etc/
вариант №2
for i := 0 to 1000000000 do a[i] := i;
ai := a[i];
for i := 0 to 1000000000 do b[ai] := i;
bai := b[ai];
for i := 0 to 1000000000 do c[bai] := i;
etc/
Я пробовал засечь по времени... Но у меня время исполнения скачет плюс минус 100 мс. и засечь не получается...
Вопрос заключается:
Как более правильно писать код с точки зрения оптимизации?
1)
2)
В смысле что ему оптимизатору и процессору удобнее читать: c[b[a[i]]] := i; или bai := b[ai]; и потом только c[bai] := i; ???
Первый вариант более короткий по записи... А второй более последовательный с визуальной точки зрения... Как более правильно???
.
вариант №1
for i := 0 to 1000000000 do a[i] := i;
for i := 0 to 1000000000 do b[a[i]] := i;
for i := 0 to 1000000000 do c[b[a[i]]] := i;
etc/
вариант №2
for i := 0 to 1000000000 do a[i] := i;
ai := a[i];
for i := 0 to 1000000000 do b[ai] := i;
bai := b[ai];
for i := 0 to 1000000000 do c[bai] := i;
etc/
Я пробовал засечь по времени... Но у меня время исполнения скачет плюс минус 100 мс. и засечь не получается...
Вопрос заключается:
Как более правильно писать код с точки зрения оптимизации?
1)
- for i := 0 to 1000000000 do c[b[a[i]]] := i;
2)
- bai := b[ai];
for i := 0 to 1000000000 do c[bai] := i;
В смысле что ему оптимизатору и процессору удобнее читать: c[b[a[i]]] := i; или bai := b[ai]; и потом только c[bai] := i; ???
Первый вариант более короткий по записи... А второй более последовательный с визуальной точки зрения... Как более правильно???
.
Re: Память процессора... Как обратиться? Заполнить? Освободи
Это не та проблема для которой нужна оптимизация. Более приоритетна читаемость кода.
Если в параметрах оптимизации зададите хранение переменных в регистрах, то пофиг.
Если в параметрах оптимизации зададите хранение переменных в регистрах, то пофиг.
Re: Память процессора... Как обратиться? Заполнить? Освободи
vada писал(а):Если в параметрах оптимизации зададите хранение переменных в регистрах
В каких параметрах?!
В параметрах Лазаруса или программы???
Я люблю когда "пофиг"... Как задать пофиг???
Всё нашёл - вопрос снимается...
http://www.freepascal.ru/forum/viewtopic.php?f=1&t=2600 - здесь ещё про оптимизацию...
.
Последний раз редактировалось vitaly_l 31.05.2012 17:09:53, всего редактировалось 2 раза.
Re: Память процессора... Как обратиться? Заполнить? Освободи
vitaly_l писал(а):вариант №1
for i := 0 to 1000000000 do a[i] := i;
for i := 0 to 1000000000 do b[a[i]] := i;
for i := 0 to 1000000000 do c[b[a[i]]] := i;
etc/
вариант №2
for i := 0 to 1000000000 do a[i] := i;
ai := a[i];
for i := 0 to 1000000000 do b[ai] := i;
bai := b[ai];
for i := 0 to 1000000000 do c[bai] := i;
etc/
Убил бы за такой код.
Re: Память процессора... Как обратиться? Заполнить? Освободи
vada писал(а):Убил бы за такой код.
стрелой из лука
Тролль убит.
PS. Завязываем с обсуждением. Бесперспективно.
Re: Память процессора... Как обратиться? Заполнить? Освободи
Вы бы лучше ответили по теме вопроса:
Какой из код будет работать быстрее, с точки зрения чтения процессором???
Вариант №1 или Вариант №2 ???
А чтобы остальным было не скучно привожу, идентичную задачку:
for i := 0 to 1000000 do
for j := 0 to 10000 do speed[i,j]; <== это работает быстрее...
for i := 0 to 1000000 do
for j := 0 to 10000 do speed[j,i]; <== это работает медленнее...
А с виду - одинаково...
А ведь ещё можно MMX - задействовать... итд... <=== Мне всё это нужно/интересно, я и спрашиваю... Тот кто знает - ответит...
PS: Если полагаете, что код плохо написан, то поясняйте, я с благодарностью, к Вам - буду писать код правильно...
PSPS: Стреляйте пожалуйста, в тролей - молча...
.
Какой из код будет работать быстрее, с точки зрения чтения процессором???
Вариант №1 или Вариант №2 ???
А чтобы остальным было не скучно привожу, идентичную задачку:
for i := 0 to 1000000 do
for j := 0 to 10000 do speed[i,j]; <== это работает быстрее...
for i := 0 to 1000000 do
for j := 0 to 10000 do speed[j,i]; <== это работает медленнее...
А с виду - одинаково...
А ведь ещё можно MMX - задействовать... итд... <=== Мне всё это нужно/интересно, я и спрашиваю... Тот кто знает - ответит...
PS: Если полагаете, что код плохо написан, то поясняйте, я с благодарностью, к Вам - буду писать код правильно...
PSPS: Стреляйте пожалуйста, в тролей - молча...
.
Последний раз редактировалось vitaly_l 03.06.2012 18:59:08, всего редактировалось 1 раз.
Re: Память процессора... Как обратиться? Заполнить? Освободи
Виталий, если Вы не хотите влазить в дебри процессорной архитектуры, тратя на ее изучение годы, то у Вас всего несколько практических приемов:
1. Выбирайте компилятор с развитыми функциями оптимизации. Например, у Интела есть платный С++ и Фортран с хорошей оптимизацией.
2. Забудьте об интерпретации (Вы недавно спрашивали как обращаться к функциям по имени), это тормозит очень сильно.
3. Реализуйте одну и туже задачу разными методами. То есть небольшую, но часто используемую часть алгоритма попробуйте реализовать немного по разному и сравните скорость. Часто быстрее работают очень неожиданные варианты. Фактически это метод тыка, но он единственный, если не изучать глубоко процессор и не изучать ассемблер.
4. Экспериментируйте с Инлайн и не Инлайн функциями. Эффект бывает разный. Иногда не Инлайн работает быстрее, как раз по причине кэша и предсказаний. Иногда наоборот.
Добавлено спустя 2 минуты 20 секунд:
Re: Память процессора... Как обратиться? Заполнить? Освободить?
На Ваши вопрос, про скорость отвечу, пробуйте сами. Только учитывайте, что бесполезный код, оптимизатор компилятора часто выкидывает, и Вы не получаете фактического замера, т.к. Ваш код просто не выполняется. Если записали переменную, то обязательно ее используйте, неиспользуемые переменные, часто выкидываются оптимизатором.
1. Выбирайте компилятор с развитыми функциями оптимизации. Например, у Интела есть платный С++ и Фортран с хорошей оптимизацией.
2. Забудьте об интерпретации (Вы недавно спрашивали как обращаться к функциям по имени), это тормозит очень сильно.
3. Реализуйте одну и туже задачу разными методами. То есть небольшую, но часто используемую часть алгоритма попробуйте реализовать немного по разному и сравните скорость. Часто быстрее работают очень неожиданные варианты. Фактически это метод тыка, но он единственный, если не изучать глубоко процессор и не изучать ассемблер.
4. Экспериментируйте с Инлайн и не Инлайн функциями. Эффект бывает разный. Иногда не Инлайн работает быстрее, как раз по причине кэша и предсказаний. Иногда наоборот.
Добавлено спустя 2 минуты 20 секунд:
Re: Память процессора... Как обратиться? Заполнить? Освободить?
На Ваши вопрос, про скорость отвечу, пробуйте сами. Только учитывайте, что бесполезный код, оптимизатор компилятора часто выкидывает, и Вы не получаете фактического замера, т.к. Ваш код просто не выполняется. Если записали переменную, то обязательно ее используйте, неиспользуемые переменные, часто выкидываются оптимизатором.
Re: Память процессора... Как обратиться? Заполнить? Освободи
alexey38 писал(а):С++ и Фортран с хорошей оптимизацией
Это для меня неприемлемый вариант... я не люблю С++, а Фортран не знаю... В Паскале(Лазарусе), всё как-то более понятно для интеллекта художника, а главное, есть всё необходимое...
alexey38 писал(а):бесполезный код, оптимизатор компилятора часто выкидывает
Ага - это всё объясняет...
alexey38 писал(а):обращаться к функциям по имени, это тормозит очень сильно.
Не понимаю причину... А какая разница??? Нелогично...
.
Re: Память процессора... Как обратиться? Заполнить? Освободи
vitaly_l писал(а): alexey38 писал(а):обращаться к функциям по имени, это тормозит очень сильно.
Не понимаю причину... А какая разница??? Нелогично...
В классической постановке вызова функций, обработку текстовых строк выполняет компилятор. А в момент выполнения программы все строки кода заменены на вызов функции по адресу.
Разбор строк во время исполнения требует выполнения условно говоря 1000 тактов процессора, а в вызываемой функции может быть намного меньше функций, что и вызывает общее торможение.
Кстати нашел ссылку на использование PascalScript (RemObjects) http://goodbyamerica.sourceforge.net/PS01_rus.html
Для оценки быстродействия под Виндой предлагаю использовать функцию:
Код: Выделить всё
Function GetSystemTimeAsFileTime64():int64;//Получение системного времени в 100 нс. интервалах
Var
tmp_FTime:TFileTime;
Begin
GetSystemTimeAsFileTime(tmp_FTime);
Result:=Int64(tmp_FTime);
End;
Она позволяет делать замер времени с точностью 100 наносекунд (реальная точность будет ниже, т.к. системный таймер тикает несколько медленнее). Что позволяет засечь медленные части алгоритма. Хотя нужно учитывать, что ОС может в любой момент прервать Вашу задачу и переключиться на некую системную. Так что в некоторых случаях разрыв по времени между двумя вызовами GetSystemTimeAsFileTime может достигать 10-20 милисекунд, что некоторые ошибочно считают погрешностью определения времени.
Добавлено спустя 7 минут 30 секунд:
Re: Память процессора... Как обратиться? Заполнить? Освободить?
И еще одно дополнение.
В исходном вопросы Вы просили в двух словах объяснить как можно написать оптимальную программу, с позиции максимального быстродействия.
В ответ спрошу Вас как художника, расскажите в двух словах, как научиться писать картины, чтобы они стали мировыми шедеврами?
В обоих случаях ответ будет одинаков: либо глубоко и тщательно изучайте технику (процессоров или живописи), либо пробуйте и если талант есть, то может получиться.
Re: Память процессора... Как обратиться? Заполнить? Освободи
alexey38 писал(а):как научиться писать картины, чтобы они стали мировыми шедеврами?
Выбирают люди, настоящему художнику - пофигу: шедевры его картины или мазня, т.к. настоящему художнику - важен сам процесс, уничтожения пустых пятен на холсте... Настоящий художник - всегда проводник... Чтобы стать проводником - грубо говоря, нужно "творить добро"... Если художник, при жизни, нравится большинству - значит он стал проводником(мастером)... Но есть исключение, это когда художника - признают только потомки... Это значит что, художник: духовно - был много выше соплеменников и не сжигал учёных на костре, за то что учёные утверждали мол якобы Земля вертится... Короче, шедевры, на самом деле - нужны людям, а не художнику... т.к. настоящие шедевры хранят...
Программирование, на самом деле - мало отлично от написания картин, просто программирование - невозможно предъявить людям в виде картины, для вынесения оценки... а оценить гениальность кода - могут только коллеги по цеху, однако сам процесс создания - абсолютно идентичен; и задействованы аналогичные процессы... И если программы хорошие и безупречно написаны, то они и востребованы... Всё тоже самое и с картинами и с музыкальными произведениями итд... Например: Лазарус - это уже произведение искусства т.к. от души..., более того является самым уникальным примером социума к которому, в итоге, всем людям - нужно стремиться, а Дельфи и С++ - нет...
И у Художников, и у Программистов - есть такое понятие как ремесло... Ремесло - это минимум, который необходимо знать... Так вот я и хочу научится ремеслу... И как всамделешный партизан(разведчик) выведываю у программистов - важные программистские секреты...
Однако, что такое inline... и как его (в каких ситуациях) грамотно использовать, пока ещё не понимаю...
PS: СПАСИБО - за скрипт и остальное.
.
Re: Память процессора... Как обратиться? Заполнить? Освободи
Вызов процедуры/функции (CALL; RET спасение/восстановление регистров), если посмотреть по процессорным тактам, довольно муторное дело требующее некоторого времени. Довольно часто бывает (если вы все делаете по книжке "Теория и практика структурного программирования"
) что издержки на вызов процедуры/функции и возврат из нее больше чем время работы самой процедуры. В этом случае inline поможет повысить быстродействие.
Встретив inline компилятор заменяет вызов процедуры/функции на код процедуры/функции описанной как inline. Т.е. не появляется вызова CALL и возврата RET при генерации кода. Просто на место вызова вставляется код самой процедуры/функции. Все просто.
Это на пальцах...
Встретив inline компилятор заменяет вызов процедуры/функции на код процедуры/функции описанной как inline. Т.е. не появляется вызова CALL и возврата RET при генерации кода. Просто на место вызова вставляется код самой процедуры/функции. Все просто.
Это на пальцах...
Re: Память процессора... Как обратиться? Заполнить? Освободи
Delphi умеет инлайнить сам, Freepascal я не проверял, но скорее всего тоже. Так что лучше не писать inline, если не знаешь что делаешь.
Насчет оптимизаций (да и прочего "программерского ремесла") очень рекомендую книгу "Совершенный Код" МакКоннелла. Как раз минимум воды и максимум полезных советов (начиная от архитектуры, именования идентификаторов и заканчивая как раз оптимизацией). Вкратце, насчет оптимизации он говорит следующее:
- оптимизации ухудшают читаемость кода. Поэтому надо сначала писать "нормальный" код, а потом уже заниматься оптимизацией.
- у компилятора есть свои методы оптимизации, ручная оптимизация им обычно будет мешать. Поэтому при всех оптимизациях надо замерять получающееся время, в зависимости от версии компилятора и конкретного случая результаты могут быть противоположные.
Насчет оптимизаций (да и прочего "программерского ремесла") очень рекомендую книгу "Совершенный Код" МакКоннелла. Как раз минимум воды и максимум полезных советов (начиная от архитектуры, именования идентификаторов и заканчивая как раз оптимизацией). Вкратце, насчет оптимизации он говорит следующее:
- оптимизации ухудшают читаемость кода. Поэтому надо сначала писать "нормальный" код, а потом уже заниматься оптимизацией.
- у компилятора есть свои методы оптимизации, ручная оптимизация им обычно будет мешать. Поэтому при всех оптимизациях надо замерять получающееся время, в зависимости от версии компилятора и конкретного случая результаты могут быть противоположные.
