Generics под капотом
От: swame  
Дата: 21.01.23 09:49
Оценка:
Встречались ли где — нибудь рекомендации, как лучше писать код с 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;


Где составляющие выражений часто повторяются в разных методах.
Вопрос, как его лучше оптимизировать для компилятора.
Отредактировано 21.01.2023 10:08 swame . Предыдущая версия . Еще …
Отредактировано 21.01.2023 9:58 swame . Предыдущая версия .
Отредактировано 21.01.2023 9:56 swame . Предыдущая версия .
Отредактировано 21.01.2023 9:54 swame . Предыдущая версия .
Отредактировано 21.01.2023 9:53 swame . Предыдущая версия .
Отредактировано 21.01.2023 9:53 swame . Предыдущая версия .
Отредактировано 21.01.2023 9:52 swame . Предыдущая версия .
Отредактировано 21.01.2023 9:51 swame . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.