lke*_*ler 0 delphi scope global-variables local-variables
我有一个程序,我的程序调用数万次,使用这样的通用结构:
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 }
Run Code Online (Sandbox Code Playgroud)
或者,我可以在全局而不是本地声明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;
Run Code Online (Sandbox Code Playgroud)
我的问题是,在这种情况下,最好是在全球而不是在本地宣布PeopleIncluded.我知道理论是尽可能在本地定义,但我想知道是否有任何问题需要担心成千上万的"创造"和"免费"?使它们成为全球只会创造一个创造,一个免费.
在这种情况下使用的推荐方法是什么?
如果推荐的方法仍然是在本地定义它,那么我想知道在本地定义仍然是一个选项的情况下是否有更好的全局定义.
关于流程的可见性,我将创建一个包含 class所有数据,一个用于初始化的方法和一个析构函数,然后一个方法来调用该流程.然后使用分析器优化速度.永远不要使用全局变量,而是将您的进程封装在小型可重用和多线程就绪的类中.
关于流程速度,简而言之:"过早优化是所有邪恶的根源" - 唐纳德克努特,引用CAR Hoare.我敢肯定的是,瓶颈是不是在TList Create/Free,但你的主要工艺循环中.
因此,在猜测可能发生的变化之前,请使用分析器查看瓶颈所在.请参阅Delphi的Profiler和内存分析工具
您可以预先分配变量和/或缓存可重用数据,使用静态数组而不是TList(或分配它并通过使用外部count变量重用它),并避免分配string实例(并在没有const参数的情况下传递它们).但也许不是一个神奇的解决方案
为了加快处理速度,改变算法几乎总是比你尝试的一些低级实现技巧更好.使用预先计算的查找表,内存预分配,避免创建临时string(例如使用PosEx而不是copy子链;或混合AnsiString/ UnicodeString),避免磁盘,API或DB调用,更改内存结构,排序数据然后使用二进制搜索,使用散列或非管道循环,让你处理多线程等等...如果没有你的过程的完整源代码,并且在真实数据上运行一个分析器,就无法猜测应该改变什么!