Re[4]: Читаемость кода?
От: Khimik  
Дата: 28.06.24 06:09
Оценка:
Я ещё чуть соптимизировал свой алгоритм, уменьшив изначальный размер массивов в секциях:

[cut]
procedure TDoubleArray.QSort10Sections;
const
SectionsCount=100;
var
sectionsize:integer;
Sections:array[0..SectionsCount-1] of tdoublearray;
q,w:integer;
minval,maxval:double;
interval:double;
begin
if fcount<300 then begin
QSort2GPT;
exit;
end;


minval:=MaxSafeFloat;
maxval:=-MaxSafeFloat;
for q:=0 to fcount-1 do begin
if fitems[q]<minval then minval:=fitems[q];
if fitems[q]>maxval then maxval:=fitems[q];
end;//next q

minval:=minval-minsafefloat;
maxval:=maxval+minsafefloat;
interval:=maxval-minval;

sectionsize:=fcount div sectionscount;
for q:=0 to sectionscount-1 do begin
sections[q]:=TDoubleArray.Create;
sections[q].Capacity:=sectionsize*2;
end;

for q:=0 to fcount-1 do begin
sections[floor((sectionscount-1)*(fitems[q]-minval)/interval)].Add(fitems[q]);
end;

count:=0;
for q:=0 to SectionsCount-1 do begin
sections[q].QSort10Sections;
for w:=0 to sections[q].fcount-1 do add(sections[q].fitems[w]);
sections[q].Free;
end;
[/cut]

end;


Я тут заменил

sections[q].Capacity:=sectionsize*10;

на

sections[q].Capacity:=sectionsize*2;

Мне вообще удивительно, почему так вышло. Я думал, чем больше этот размер, тем лучше (если хватает на всё памяти). Если его сделать маленьким — лишнее время будет уходить на пересоздавание массивов и перефрагментирование, когда в capacity не влезает count. Но почему с большим размером тоже скорость чуть помедленнее — для меня странно. Вроде ReallocMem в Delphi не заполняет массив нулями? Значит лишние такты уходят на какое-то перефрагментирование?
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.