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

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

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

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

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

Сообщение Alex_123_1 »

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

Код: Выделить всё

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:
Аватара пользователя
coyot.rush
постоялец
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Сообщение coyot.rush »

попробуйте

Код: Выделить всё

 -Oo LOOPUNROLL
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Конкретно этот код Дельфи оптимизирует так, что цикл вообще ничего не будет делать (т.к. значение, присвоенное i, не используется, присвоение будет выброшено).
Alex_123_1
новенький
Сообщения: 26
Зарегистрирован: 24.07.2009 10:02:52

Сообщение Alex_123_1 »

coyot.rush писал(а):попробуйте

Код: Выделить всё

 -Oo LOOPUNROLL


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


Код: Выделить всё

showmessage(inttostr(b-a)+'  '+inttostr(i));


ну собсно 63 тика против 262-х
Аватара пользователя
coyot.rush
постоялец
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Сообщение coyot.rush »

-Oo LOOPUNROLL

опция компилятора fpc для размотки цикла
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

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;
Alex_123_1
новенький
Сообщения: 26
Зарегистрирован: 24.07.2009 10:02:52

Сообщение Alex_123_1 »

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

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



Ммм еще раз извините. Покажите пожалуйста, наглядно, как его оформлять и куда в юниту втыкать. Собсно на лазарусе это первый у меня боле-менее серьезный проект. А в делфях и так все работает ((
Аватара пользователя
coyot.rush
постоялец
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Сообщение coyot.rush »

Папаметры проекта=> Другие=> Параметры пользователя=> {-Oo LOOPUNROLL}
Alex_123_1
новенький
Сообщения: 26
Зарегистрирован: 24.07.2009 10:02:52

Сообщение Alex_123_1 »

>>Odyssey 04.02.2011 16:41:34

Тоже самое.

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

Не помогло (
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

Извиняюсь, в моём примере конечно же тоже нужно

Код: Выделить всё

showmessage(inttostr(b-a)+'  '+inttostr(i));

Если и с ним ситуация будет такой же, то останется только спрашивать разработчиков в списке рассылки. Информация о подписке - тут: http://www.freepascal.org/maillist.var . В письме (на англ.) обязательно привести пример. Чтобы ускорить ответ, приложение лучше переделать в простое консольное, а showmessage заменить на writeln.
Alex_123_1
новенький
Сообщения: 26
Зарегистрирован: 24.07.2009 10:02:52

Сообщение Alex_123_1 »

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


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

Код: Выделить всё

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;
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

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

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

Если есть проблемы с английским - можно использовать автопереводчик + словарь для проверки, и составлять приложения покороче и попроще. Стесняться в этом случае нечего, в рассылку иногда и не такое пишут.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Некоторые разработчики и русский понимают :-)
Знаю по собственному опыту... (был интересный момент, когда я тренировался в английском, а мой собеседник - в русском).
Alex_123_1
новенький
Сообщения: 26
Зарегистрирован: 24.07.2009 10:02:52

Сообщение Alex_123_1 »

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

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

Код: Выделить всё

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
Аватара пользователя
Иван Шихалев
энтузиаст
Сообщения: 1138
Зарегистрирован: 15.05.2006 11:26:13
Откуда: Екатеринбург
Контактная информация:

Сообщение Иван Шихалев »

А с ключиком -O2 тоже в памяти? У меня уходит в регистр.
Ответить