kazalex писал(а):daesher писал(а):Скорее всего, дело в строках.
FFT со строками?
daesher писал(а):Я тоже этот эффект заметил.
Когда мне, с горем пополам, удалось собрать свою библиотеку под FPC и запустить бенчик, я был немало удивлён, что производительность оказалась на уровне дельфей (думал будет сильно хуже), при том, что менеджер памяти в FPC, мягко говоря, не блещет. В бенчике значительная часть, как раз, связана с работой со строками.
ntechmen писал(а):это цифры при включенной оптимизации, лучшие варианты. В fpc 3 оптимизацию по -О4, не дала ни каких преимуществ, иногда даже ухудшает.
Код покажешь?
type
TArrayValues = array of double;
const
TwoPi = 6.283185307179586;
var
Form1: TForm1;
implementation
{$R *.lfm}
// AVal - массив анализируемых данных, Nvl - длина массива, должна быть кратна степени 2.
// FTvl - массив полученных значений, Nft - длина массива, должна быть равна Nvl / 2 или меньше.
procedure FFTAnalysis(var AVal, FTvl: TArrayValues; Nvl, Nft: integer);
var
i, j, n, m, Mmax, Istp: integer;
Tmpr, Tmpi, Wtmp, Theta: double;
Wpr, Wpi, Wr, Wi: double;
Tmvl: TArrayValues;
begin
n := Nvl * 2;
SetLength(Tmvl, n);
for i := 0 to Nvl - 1 do
begin
j := i * 2;
Tmvl[j] := 0;
Tmvl[j + 1] := AVal[i];
end;
i := 1;
j := 1;
while i < n do
begin
if j > i then
begin
Tmpr := Tmvl[i];
Tmvl[i] := Tmvl[j];
Tmvl[j] := Tmpr;
Tmpr := Tmvl[i + 1];
Tmvl[i + 1] := Tmvl[j + 1];
Tmvl[j + 1] := Tmpr;
end;
i := i + 2;
m := Nvl;
while (m >= 2) and (j > m) do
begin
j := j - m;
m := m div 2;
end;
j := j + m;
end;
Mmax := 2;
while n > Mmax do
begin
Theta := -TwoPi / Mmax;
Wpi := Sin(Theta);
Wtmp := Sin(Theta / 2);
Wpr := Wtmp * Wtmp * 2;
Istp := Mmax * 2;
Wr := 1;
Wi := 0;
m := 1;
while m < Mmax do
begin
i := m;
m := m + 2;
Tmpr := Wr;
Tmpi := Wi;
Wr := Wr - Tmpr * Wpr - Tmpi * Wpi;
Wi := Wi + Tmpr * Wpi - Tmpi * Wpr;
while i < n do
begin
j := i + Mmax;
Tmpr := Wr * Tmvl[j] - Wi * Tmvl[j - 1];
Tmpi := Wi * Tmvl[j] + Wr * Tmvl[j - 1];
Tmvl[j] := Tmvl[i] - Tmpr;
Tmvl[j - 1] := Tmvl[i - 1] - Tmpi;
Tmvl[i] := Tmvl[i] + Tmpr;
Tmvl[i - 1] := Tmvl[i - 1] + Tmpi;
i := i + Istp;
end;
end;
Mmax := Istp;
end;
for i := 0 to Nft - 1 do
begin
j := i * 2;
FTvl[i] := 2 * Sqrt(Sqr(Tmvl[j]) + Sqr(Tmvl[j + 1])) / Nvl;
end;
SetLength(Tmvl, 0);
end;
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
BufSig:TArrayValues;
FAmp:TArrayValues;
tStamp1,tStamp2: Cardinal;
begin
Memo1.Clear;
SetLength(BufSig,1048576);
SetLength(FAmp,524288);
Memo1.Lines.Add('Signal array = '+IntToStr(Length(BufSig)));
Memo1.Lines.Add('Analysis array = '+IntToStr(Length(FAmp)));
FillChar(BufSig,sizeof(BufSig),0);
FillChar(FAmp,sizeof(FAmp),0);
//Временая отметка Начало
tStamp1:=GetTickCount;
for i:=1 to 100000000 do begin
FFTAnalysis(BufSig,FAmp,Length(BufSig),Length(fAmp));
end;
tStamp2:=GetTickCount;
//Временая отметка Конец
Memo1.Lines.Add('FFTAnalysis time = '+IntToStr(tStamp2-tStamp1));
SetLength(BufSig,0);
SetLength(FAmp,0);
end;
тестировалось на проце I5-4210M 2.6 GHZ turbo 3.2 GHz, компиляции с оптимизациями для x86_32.
/*интересный момент, при компиляции на FPC 3.0.0 для x86_64 ATHLON64 время было около 2200 мсек.*/
но почем у 32х разрядный код такой медленный у FPC 3.0.0?