медленное выполнение циклов

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

медленное выполнение циклов

Сообщение Alex_123_1 » 04.02.2011 14:06:20

Здравствуйте.
Один и тот же код

Код: Выделить всё
procedure TForm1.Button10Click(Sender: TObject);
var
i,x:integer;
a, b:integer;
begin
a := GetTickCount;
for x:=0 to 100000000 do i:=x+123 ;
b := GetTickCount;
showmessage(inttostr(b-a));

end;


Выполняется в lazarus намного медленнее чем в делфях. Если в делфях ~ 40 тиков, то в Лазарусе 266...
Тут можно что либо сделать? ибо критично :cry:
Alex_123_1
новенький
 
Сообщения: 26
Зарегистрирован: 24.07.2009 10:02:52

Re: медленное выполнение циклов

Сообщение coyot.rush » 04.02.2011 14:46:31

попробуйте
Код: Выделить всё
-Oo LOOPUNROLL
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Re: медленное выполнение циклов

Сообщение Sergei I. Gorelkin » 04.02.2011 14:53:31

Конкретно этот код Дельфи оптимизирует так, что цикл вообще ничего не будет делать (т.к. значение, присвоенное i, не используется, присвоение будет выброшено).
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: медленное выполнение циклов

Сообщение Alex_123_1 » 04.02.2011 15:32:40

coyot.rush писал(а):попробуйте
Код: Выделить всё
-Oo LOOPUNROLL


ммм а это кто? извините.


Код: Выделить всё
showmessage(inttostr(b-a)+'  '+inttostr(i));


ну собсно 63 тика против 262-х
Alex_123_1
новенький
 
Сообщения: 26
Зарегистрирован: 24.07.2009 10:02:52

Re: медленное выполнение циклов

Сообщение coyot.rush » 04.02.2011 16:11:16

-Oo LOOPUNROLL

опция компилятора fpc для размотки цикла
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Re: медленное выполнение циклов

Сообщение Odyssey » 04.02.2011 16:41:34

Alex_123_1 писал(а):ну собсно 63 тика против 262-х

А если так?
Код: Выделить всё
procedure TForm1.Button10Click(Sender: TObject);
var
i,x:integer;
a, b:integer;
begin
i := 0;
a := GetTickCount;
for x:=0 to 100000000 do i:=i+123 ;
b := GetTickCount;
showmessage(inttostr(b-a));
end;
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: медленное выполнение циклов

Сообщение Alex_123_1 » 04.02.2011 19:33:13

coyot.rush писал(а):
-Oo LOOPUNROLL

опция компилятора fpc для размотки цикла



Ммм еще раз извините. Покажите пожалуйста, наглядно, как его оформлять и куда в юниту втыкать. Собсно на лазарусе это первый у меня боле-менее серьезный проект. А в делфях и так все работает ((
Alex_123_1
новенький
 
Сообщения: 26
Зарегистрирован: 24.07.2009 10:02:52

Re: медленное выполнение циклов

Сообщение coyot.rush » 04.02.2011 20:21:13

Папаметры проекта=> Другие=> Параметры пользователя=> {-Oo LOOPUNROLL}
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Re: медленное выполнение циклов

Сообщение Alex_123_1 » 05.02.2011 08:13:48

>>Odyssey 04.02.2011 16:41:34

Тоже самое.

>>Папаметры проекта=> Другие=> Параметры пользователя=> {-Oo LOOPUNROLL}

Не помогло (
Alex_123_1
новенький
 
Сообщения: 26
Зарегистрирован: 24.07.2009 10:02:52

Re: медленное выполнение циклов

Сообщение Odyssey » 05.02.2011 13:44:39

Извиняюсь, в моём примере конечно же тоже нужно
Код: Выделить всё
showmessage(inttostr(b-a)+'  '+inttostr(i));

Если и с ним ситуация будет такой же, то останется только спрашивать разработчиков в списке рассылки. Информация о подписке - тут: http://www.freepascal.org/maillist.var . В письме (на англ.) обязательно привести пример. Чтобы ускорить ответ, приложение лучше переделать в простое консольное, а showmessage заменить на writeln.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: медленное выполнение циклов

Сообщение Alex_123_1 » 05.02.2011 14:46:21

Ситуация такая же. Может кто нибуть отписать это разработчикам? С английским у меня не очень...


похоже придется юзать ассемблерные вставки. Уж они то выполняются нормально.
Где-то так

Код: Выделить всё
var
  i, x: integer;
  a, b: integer;
begin
a := GetTickCount;
i := 0;
{$ASMMODE INTEL}
  asm
    mov eax,10000000
    @@ttt:  inc i
     dec eax
     jnz @@ttt
  end;
  b := GetTickCount;
  showmessage(inttostr(b - a) + '  ' + inttostr(i));
end;
Alex_123_1
новенький
 
Сообщения: 26
Зарегистрирован: 24.07.2009 10:02:52

Re: медленное выполнение циклов

Сообщение Odyssey » 05.02.2011 15:48:33

Alex_123_1 писал(а):Может кто нибуть отписать это разработчикам? С английским у меня не очень...

Разработчики, как правило, задают свои вопросы, уточняют детали и могут предлагать решения, которые нужно проверять. Поэтому "кто-нибудь", кто согласится это сделать, рискует на несколько дней стать по совместительству переводчиком, тестером и испорченным телефоном. Для такого нужна очень серьёзная личная заинтересованность в решении проблемы. И ещё Windows c Delphi под рукой для тестирования.

Если есть проблемы с английским - можно использовать автопереводчик + словарь для проверки, и составлять приложения покороче и попроще. Стесняться в этом случае нечего, в рассылку иногда и не такое пишут.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: медленное выполнение циклов

Сообщение alexs » 05.02.2011 16:27:34

Некоторые разработчики и русский понимают :-)
Знаю по собственному опыту... (был интересный момент, когда я тренировался в английском, а мой собеседник - в русском).
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: медленное выполнение циклов

Сообщение Alex_123_1 » 05.02.2011 17:56:52

Короче я нашел где косяки. И помоему ничего здесь не сделаешь, действительно к разаработчикам обращаться нужно. Тут компилятор косячит.

А все потому, что счетчик кругов находится в памяти, а не в регистре как у делфей. Отсюда и тормоза

Код: Выделить всё
0041F378   INC DWORD PTR SS:[EBP-10]
0041F37B   CMP DWORD PTR SS:[EBP-10],5F5E100
0041F382   JL SHORT project1.0041F378


////////////так у делфей

0045ED1A  DEC EAX
0045ED1B  JNZ SHORT Project1.0045ED1A
Alex_123_1
новенький
 
Сообщения: 26
Зарегистрирован: 24.07.2009 10:02:52

Re: медленное выполнение циклов

Сообщение Иван Шихалев » 05.02.2011 18:04:46

А с ключиком -O2 тоже в памяти? У меня уходит в регистр.
Аватара пользователя
Иван Шихалев
энтузиаст
 
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург

След.

Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru