У меня есть процедура, которую моя программа вызывает десятки тысяч раз, которая использует такую общую структуру:
procedure PrintIndiEntry(JumpID: string);
type
TPeopleIncluded = record
IndiPtr: pointer;
Relationship: string;
end;
var
PeopleIncluded: TList<TPeopleIncluded>;
PI: TPeopleIncluded;
begin { PrintIndiEntry }
PeopleIncluded := TList<TPeopleIncluded>.Create;
{ A loop here that determines a small number (up to 100) people to process }
while ... do begin
PI.IndiPtr := ...;
PI.Relationship := ...;
PeopleIncluded.Add(PI);
end;
DoSomeProcess(PeopleIncluded);
PeopleIncluded.Clear;
PeopleIncluded.Free;
end { PrintIndiEntry }
В качестве альтернативы я могу объявить PeopleIncluded глобально, а не локально, следующим образом:
unit process;
interface
type
TPeopleIncluded = record
IndiPtr: pointer;
Relationship: string;
end;
var
PeopleIncluded: TList<TPeopleIncluded>;
PI: TPeopleIncluded;
procedure PrintIndiEntry(JumpID: string);
begin { PrintIndiEntry }
{ A loop here that determines a small number (up to 100) people to process }
while ... do begin
PI.IndiPtr := ...;
PI.Relationship := ...;
PeopleIncluded.Add(PI);
end;
DoSomeProcess(PeopleIncluded);
PeopleIncluded.Clear;
end { PrintIndiEntry }
procedure InitializeProcessing;
begin
PeopleIncluded := TList<TPeopleIncluded>.Create;
end;
procedure FinalizeProcessing;
begin
PeopleIncluded.Free;
end;
У меня вопрос, лучше ли в этой ситуации объявлять PeopleIncluded глобально, а не локально. Я знаю, что теория заключается в том, чтобы определять локально, когда это возможно, но я хотел бы знать, есть ли какие-либо проблемы, о которых стоит беспокоиться, в отношении выполнения десятков тысяч «create» и «free»? Сделав их глобальными, вы сделаете только одно создание и одно бесплатное.
Какой метод рекомендуется использовать в этом случае?
Если рекомендуемый метод по-прежнему состоит в том, чтобы определять его локально, то мне интересно, есть ли ситуации, когда лучше определять глобально, когда определение локально по-прежнему возможно.