如何快速清除简单类型的记录?

Sal*_*dor 28 delphi

我有一个像这样定义的结构:

const
  MaxSignalRecords=255;
type
  TSignalRecord=record
   signal1  : integer;
   signal2  : integer;
   signal3  : integer;
   signal4  : integer;
   signal5  : integer;
   signal6  : integer;
   bsignal1 : Boolean;
   bsignal2 : Boolean;
   bsignal3 : Boolean;
   bsignal4 : Boolean;
   bsignal5 : Boolean;
   bsignal6 : Boolean;
  end;

TListSignals = Array[0..MaxSignalRecords-1] of TSignalRecord;
Run Code Online (Sandbox Code Playgroud)

此结构用于在如下算法中进行数千次计算:

for i:=1 to 900000 do
begin
  CleartheList(MyList);
  DotheMath(MyList);
  DotheChart(MyList);
end;
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种快速的方法来将我的值初始化TListSignals为0和false.

现在我用这个:

procedure ClearListSignals(var ListSignals:TListSignals);
var
  i :Integer;
begin
  for i := 0 to MaxSignalRecords - 1 do
  with ListSignals[i] do
  begin
   signal1   :=0;
   signal2   :=0;
   signal3   :=0;
   signal4   :=0;
   signal5   :=0;
   signal6   :=0;
   bsignal1  :=false;
   bsignal2  :=false;
   bsignal3  :=false;
   bsignal4  :=false;
   bsignal5  :=false;
   bsignal6  :=false;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

如何提高ClearListSignals程序的性能?

RRU*_*RUZ 29

您可以使用本机中的ZeroMemory程序Windows.

var
  MyList : TListSignals;
begin
     ZeroMemory(@Mylist,SizeOf(MyList));
end;
Run Code Online (Sandbox Code Playgroud)

  • @SolarWind,如果记录中包含字符串有值,ZeroMemory会导致内存泄漏.您可以首先在记录上调用Finalize()以在调用ZeroMemory之前释放字符串. (2认同)

Z.B*_*.B. 23

你应该使用标准的Delphi语言函数Default()!

const
  MaxSignalRecords = 255;

type
  TSignalRecord = record
    ...
    bsignal6 : Boolean;
  end;

var
  X: TSignalRecord
...
X := Default(TSignalRecord);
...
Run Code Online (Sandbox Code Playgroud)

没有黑客......如前所述......


Mis*_*sha 13

FillChar(ListSignals, SizeOf(ListSignals), 0);
Run Code Online (Sandbox Code Playgroud)

  • FillChar在`System`中定义,使其与平台无关,ZeroMemory仅适用于Windows. (6认同)
  • ZeroMemory是一个使用FullChar的内联,但是ZeroMemory读得更好 (3认同)

Tho*_*ler 10

除了所说的内容FillCharZeroMemory(无论如何内部只调用FillChar),您可以通过使用bsignal: set of 1..6;而不是单个布尔值来减小记录的大小,这应该会略微加快清算速度.

  • 浪费空间的问题不是RAM的货币成本,而是缓存使用不当所带来的速度影响.但它在这里并不那么重要,因为布尔值的对齐方式为1. (2认同)