Память процессора... Как обратиться? Заполнить? Освободить?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Память процессора... Как обратиться? Заполнить? Освободи

Сообщение Brainenjii » 31.05.2012 15:38:12

ещё один тролль... Что-то их много стало на форуме последнее время...
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Память процессора... Как обратиться? Заполнить? Освободи

Сообщение Mr.Smart » 31.05.2012 15:52:28

Brainenjii писал(а):ещё один тролль... Что-то их много стало на форуме последнее время...

Это наш художник. Единственный и неповторимый :wink:
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Память процессора... Как обратиться? Заполнить? Освободи

Сообщение vitaly_l » 31.05.2012 16:10:27

Лучше скажите, что будет работать быстрее, с точки зрения оптимизации???:

вариант №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; ???

Первый вариант более короткий по записи... А второй более последовательный с визуальной точки зрения... Как более правильно???



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Память процессора... Как обратиться? Заполнить? Освободи

Сообщение vada » 31.05.2012 16:33:13

Это не та проблема для которой нужна оптимизация. Более приоритетна читаемость кода.
Если в параметрах оптимизации зададите хранение переменных в регистрах, то пофиг.
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Память процессора... Как обратиться? Заполнить? Освободи

Сообщение vitaly_l » 31.05.2012 16:37:53

vada писал(а):Если в параметрах оптимизации зададите хранение переменных в регистрах

В каких параметрах?!
В параметрах Лазаруса или программы???
Я люблю когда "пофиг"... Как задать пофиг??? :cry:

Всё нашёл - вопрос снимается...

http://www.freepascal.ru/forum/viewtopic.php?f=1&t=2600 - здесь ещё про оптимизацию...
.
Последний раз редактировалось vitaly_l 31.05.2012 17:09:53, всего редактировалось 2 раз(а).
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Память процессора... Как обратиться? Заполнить? Освободи

Сообщение vada » 31.05.2012 16:41:38

Точно троль :wink:
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Память процессора... Как обратиться? Заполнить? Освободи

Сообщение Kemper » 01.06.2012 14:48:49

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/

Убил бы за такой код.
Kemper
новенький
 
Сообщения: 61
Зарегистрирован: 18.05.2010 00:29:44

Re: Память процессора... Как обратиться? Заполнить? Освободи

Сообщение GrayEddy » 01.06.2012 15:04:02

vada писал(а):Убил бы за такой код.


стрелой из лука :)
Тролль убит.

PS. Завязываем с обсуждением. Бесперспективно.
GrayEddy
постоялец
 
Сообщения: 375
Зарегистрирован: 06.05.2005 09:37:56

Re: Память процессора... Как обратиться? Заполнить? Освободи

Сообщение vitaly_l » 01.06.2012 16:24:25

Вы бы лучше ответили по теме вопроса:
Какой из код будет работать быстрее, с точки зрения чтения процессором???
Вариант №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 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Память процессора... Как обратиться? Заполнить? Освободи

Сообщение alexey38 » 02.06.2012 13:59:58

Виталий, если Вы не хотите влазить в дебри процессорной архитектуры, тратя на ее изучение годы, то у Вас всего несколько практических приемов:
1. Выбирайте компилятор с развитыми функциями оптимизации. Например, у Интела есть платный С++ и Фортран с хорошей оптимизацией.
2. Забудьте об интерпретации (Вы недавно спрашивали как обращаться к функциям по имени), это тормозит очень сильно.
3. Реализуйте одну и туже задачу разными методами. То есть небольшую, но часто используемую часть алгоритма попробуйте реализовать немного по разному и сравните скорость. Часто быстрее работают очень неожиданные варианты. Фактически это метод тыка, но он единственный, если не изучать глубоко процессор и не изучать ассемблер.
4. Экспериментируйте с Инлайн и не Инлайн функциями. Эффект бывает разный. Иногда не Инлайн работает быстрее, как раз по причине кэша и предсказаний. Иногда наоборот.

Добавлено спустя 2 минуты 20 секунд:
Re: Память процессора... Как обратиться? Заполнить? Освободить?
На Ваши вопрос, про скорость отвечу, пробуйте сами. Только учитывайте, что бесполезный код, оптимизатор компилятора часто выкидывает, и Вы не получаете фактического замера, т.к. Ваш код просто не выполняется. Если записали переменную, то обязательно ее используйте, неиспользуемые переменные, часто выкидываются оптимизатором.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Память процессора... Как обратиться? Заполнить? Освободи

Сообщение vitaly_l » 02.06.2012 15:43:07

alexey38 писал(а):С++ и Фортран с хорошей оптимизацией

Это для меня неприемлемый вариант... я не люблю С++, а Фортран не знаю... В Паскале(Лазарусе), всё как-то более понятно для интеллекта художника, а главное, есть всё необходимое...

alexey38 писал(а):бесполезный код, оптимизатор компилятора часто выкидывает

Ага - это всё объясняет...

alexey38 писал(а):обращаться к функциям по имени, это тормозит очень сильно.

Не понимаю причину... А какая разница??? Нелогично...


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Память процессора... Как обратиться? Заполнить? Освободи

Сообщение alexey38 » 03.06.2012 10:02:19

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: Память процессора... Как обратиться? Заполнить? Освободить?
И еще одно дополнение.
В исходном вопросы Вы просили в двух словах объяснить как можно написать оптимальную программу, с позиции максимального быстродействия.
В ответ спрошу Вас как художника, расскажите в двух словах, как научиться писать картины, чтобы они стали мировыми шедеврами?

В обоих случаях ответ будет одинаков: либо глубоко и тщательно изучайте технику (процессоров или живописи), либо пробуйте и если талант есть, то может получиться.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Память процессора... Как обратиться? Заполнить? Освободи

Сообщение vitaly_l » 03.06.2012 14:25:03

alexey38 писал(а):как научиться писать картины, чтобы они стали мировыми шедеврами?

Выбирают люди, настоящему художнику - пофигу: шедевры его картины или мазня, т.к. настоящему художнику - важен сам процесс, уничтожения пустых пятен на холсте... Настоящий художник - всегда проводник... Чтобы стать проводником - грубо говоря, нужно "творить добро"... Если художник, при жизни, нравится большинству - значит он стал проводником(мастером)... Но есть исключение, это когда художника - признают только потомки... Это значит что, художник: духовно - был много выше соплеменников и не сжигал учёных на костре, за то что учёные утверждали мол якобы Земля вертится... Короче, шедевры, на самом деле - нужны людям, а не художнику... т.к. настоящие шедевры хранят...

Программирование, на самом деле - мало отлично от написания картин, просто программирование - невозможно предъявить людям в виде картины, для вынесения оценки... а оценить гениальность кода - могут только коллеги по цеху, однако сам процесс создания - абсолютно идентичен; и задействованы аналогичные процессы... И если программы хорошие и безупречно написаны, то они и востребованы... Всё тоже самое и с картинами и с музыкальными произведениями итд... Например: Лазарус - это уже произведение искусства т.к. от души..., более того является самым уникальным примером социума к которому, в итоге, всем людям - нужно стремиться, а Дельфи и С++ - нет...

И у Художников, и у Программистов - есть такое понятие как ремесло... Ремесло - это минимум, который необходимо знать... Так вот я и хочу научится ремеслу... И как всамделешный партизан(разведчик) выведываю у программистов - важные программистские секреты... :roll: С миру по нитке - всем кто прочитает рубашка...

Однако, что такое inline... и как его (в каких ситуациях) грамотно использовать, пока ещё не понимаю... :cry: Хотя уже знаю, что inline может повысить быстродействие, но работает не всегда и не везде...

PS: СПАСИБО - за скрипт и остальное.



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Память процессора... Как обратиться? Заполнить? Освободи

Сообщение vada » 04.06.2012 14:28:05

Вызов процедуры/функции (CALL; RET спасение/восстановление регистров), если посмотреть по процессорным тактам, довольно муторное дело требующее некоторого времени. Довольно часто бывает (если вы все делаете по книжке "Теория и практика структурного программирования" :wink: ) что издержки на вызов процедуры/функции и возврат из нее больше чем время работы самой процедуры. В этом случае inline поможет повысить быстродействие.
Встретив inline компилятор заменяет вызов процедуры/функции на код процедуры/функции описанной как inline. Т.е. не появляется вызова CALL и возврата RET при генерации кода. Просто на место вызова вставляется код самой процедуры/функции. Все просто.
Это на пальцах...
Аватара пользователя
vada
энтузиаст
 
Сообщения: 691
Зарегистрирован: 14.02.2006 13:43:17

Re: Память процессора... Как обратиться? Заполнить? Освободи

Сообщение kipar » 04.06.2012 14:40:10

Delphi умеет инлайнить сам, Freepascal я не проверял, но скорее всего тоже. Так что лучше не писать inline, если не знаешь что делаешь.

Насчет оптимизаций (да и прочего "программерского ремесла") очень рекомендую книгу "Совершенный Код" МакКоннелла. Как раз минимум воды и максимум полезных советов (начиная от архитектуры, именования идентификаторов и заканчивая как раз оптимизацией). Вкратце, насчет оптимизации он говорит следующее:
- оптимизации ухудшают читаемость кода. Поэтому надо сначала писать "нормальный" код, а потом уже заниматься оптимизацией.
- у компилятора есть свои методы оптимизации, ручная оптимизация им обычно будет мешать. Поэтому при всех оптимизациях надо замерять получающееся время, в зависимости от версии компилятора и конкретного случая результаты могут быть противоположные.
kipar
новенький
 
Сообщения: 78
Зарегистрирован: 04.03.2010 12:15:54

Пред.След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 220

Рейтинг@Mail.ru