Встречались ли где — нибудь рекомендации, как лучше писать код с Generics, чтобы меньше нагружать компилятор?
Например, насколько будет разница в используетмой памяти, скорости компиляции, итоовом коде при компиляции при таком использованнии Generics:
| Код1 |
| TStringMap = TDictionary<string,string>;
class TMyClass
FMap : TStringMap;
constructor Create;
end;
constructor TMyClass.Create;
begin
inherited;
FMap := TStringMap.Create;
end;
|
| |
или
| Код2 |
| class TMyClass;
FMap : TDictionary<string,string>;
constructor Create;
end;
constructor TMyClass.Create;
begin
inherited;
FMap := TDictionary<string,string>.Create;
end;
|
| |
Проблема в том , что заканчивается память при компиляции из среды (bds.exe доходит до предела 3Гб).
Программа порядка 1,8 млн строк (только своих) + сторонние компоненты.
Около 2500 только своих модулей
Delphi 10.4.2
Подозреваю что больше всего нагружает компилятор циклические зависимости между модулями (но они почти все разрулены) и сложные конструкции с Generics.
В программе много кода в стиле типа такого
| Код3 |
| procedure TfrmTopGraphDM.actSaveNearestGIds4ShRPExecute(Sender: TObject);
type
RPair = record
nb1, nb2: TNB;
end;
var
sch: TSchemeSet;
lPairs: TRStream<String>;
begin
sch := App.SDEDocs.Active;
if not Assigned(sch) then exit;
lPairs :=
TRStream<TNB>.stream<Integer>(sch.Techs)
.map<TNB>(
procedure (aNB: TNB; var aMap: TProc<TNB>)
begin
if (aNB.IsChildOrEqual(ttcPowerTransformer) and TCEAPI.isShRP(aNB)) then
aMap(aNB);
end)
.map<RPair>(
procedure (aNB: TNB; var aMap: TProc<RPair>)
var
lSwitch: TCE;
lPair: RPair;
begin
lSwitch := TRStream<TNB>
.just(aNB)
.map<TCE>(TCeAPI.ce)
.map(TCeAPI.find(TCERules.windingExtraTerminalsRules,
function (aCe: TCE): Boolean
begin
Result := aCe.IsChildOrEqual(ttcSwitch) and not TCEAPI.isCandle(aCE) and (TCEAPI.globalId(aCE) <> '');
end, True))
.first
.toArray()
.firstItem;
if Assigned(lSwitch) then
begin
lPair.nb1 := aNB;
lPair.nb2 := lSwitch;
aMap(lPair);
end;
end)
.map<String>(
procedure (aPair: RPair; var aMap: TProc<String>)
begin
aMap(TTopGraphUtils.SaveNB(aPair.nb1) + CSV_DELIMETER + TTopGraphUtils.SaveNB(aPair.nb2));
end);
TRIO.saveToFile(lPairs);
end;
|
| |
Где составляющие выражений часто повторяются в разных методах.
Вопрос, как его лучше оптимизировать для компилятора.