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?