LCL :
SSE + -O1 = 432
SSE + -O3 = 812 (по идеи должно быть быстрее).
Console :
SSE + -O1 = 432
SSE + -O3 = 432
Цикл и функция в DLL, программа консольная и LCL :
SSE + -O1 = 432
SSE + -O3 = 812 (по идеи должно быть быстрее).
Вот код проверки (LCL):
- Код: Выделить всё
- implementation
 uses
 windows;
 {$R *.lfm}
 { TForm1 }
 Function Test(B, C : Single) : Single;
 begin
 Result := (((B + C) * B) / C) - B;
 end;
 procedure TForm1.Button1Click(Sender: TObject);
 begin
 P1 := 234.34;
 P2 := 4363.34;
 T := GetTickCount;
 For I := 0 to 99999999 do
 A := Test(P1, P2);
 T := GetTickCount - T;
 ShowMEssage(IntToStr(T));
 end;
 end.
Код проверки Console:
- Код: Выделить всё
- program test;
 uses
 windows, SysUtils, Math;
 var
 P1, P2, A : Single;
 I, T : Cardinal;
 Function FasmAdd(Aa, Ba : Single) : Single;
 begin
 Result := (((Aa + Ba) * Aa) / Ba) - Aa;
 end;
 begin
 writeln(inttostr( GetSSECSR ));
 P1 := 234.34;
 P2 := 4363.34;
 T := GetTickCount;
 For I := 0 to 99999999 do
 A := FasmAdd(P1, P2);
 T := GetTickCount - T;
 
 writeln(inttostr( T ));
 readln;
 end.
При использовании DLL:
- Код: Выделить всё
- //******************************************************************
 library test1;
 uses
 windows, SysUtils, Math;
 var
 P1, P2, A : Single;
 I, T : Cardinal;
 Function FasmAdd(Aa, Ba : Single) : Single;
 begin
 Result := (((Aa + Ba) * Aa) / Ba) - Aa;
 end;
 Function StartTest : Cardinal; StdCall;
 begin
 P1 := 234.34;
 P2 := 4363.34;
 T := GetTickCount;
 For I := 0 to 99999999 do
 A := FasmAdd(P1, P2);
 Result := GetTickCount - T;
 end;
 exports
 StartTest;
 begin
 end.
 //******************************************************************
 program Console;
 {$mode objfpc}{$H+}
 uses
 SysUtils, Math;
 Function StartTest : Cardinal; StdCall; external 'test1.dll';
 begin
 writeln(inttostr( GetSSECSR ));
 writeln(inttostr( StartTest ));
 readln;
 end.
Для использования SSE использовал: FPUTYPE и -Cfsse. Для включения оптимизаций: настройки проекта и -O1..3. Как и ожидалось различий нет (думал что Lazarus не те параметры сообщает компилятору)
Сверял использование исключений как FPU так и SSE, при всех компиляциях одинаковы.
Версия Lazarus 1.0.12, FPC 2.6.2.
Кто подскажет, почему падает производительность у LCL и DLL(учитывая что в ней весь цикл теста) при оптимизации 3 и использовании SSE?




 Даже уже использовал команду присвоения исключений с OpenGL модуля, не помогло. SetFPUException вроде.
  Даже уже использовал команду присвоения исключений с OpenGL модуля, не помогло. SetFPUException вроде.

