通过一系列记录优化工作

时间:2018-08-05 18:42:35

标签: arrays delphi delphi-2009 records

我有一个带有记录类型数组的以下对象:

type
  TTimeMark = record
   // many fields here
  end;

  TTimeMarks = array of TTimeMark;

  TUserProfile = class(TObject)
    TimeLine: TTimeMarks;
    ....
  end;

在运行时,将在列表TUserProfile.TimeLine中插入项目。除了将数组的长度增加一个,然后将所有项目向下移动一个位置,直到到达所需位置,我不知道一种插入项目的方法。但是在此数组中,项是具有许多字段的记录,因此,如果我执行TimeLine[I]:= TimeLine[I-1],则内存中的所有数据都将从一个位置复制到另一个位置(对吗?),这将花费一些时间。时间。您认为应该改为使用该记录的指针数组吗?还是有其他快速方法可以做到这一点?

1 个答案:

答案 0 :(得分:0)

这就是我的工作方式。.我使用了一个指针数组,并做了一些步骤来轻松添加,删除和移动项目:

TPointerArray = array of Pointer;

procedure PArrayInsert(var AArray: TPointerArray; Position: Integer; Count: Integer = 1);
var L, CTail: Integer;
begin
 L:= Length(AArray);
 if (Count = 0) or (Position > L) then Exit;
 SetLength(AArray, L + Count);
 CTail:= L - Position;
 if CTail > 0 then
  Move(AArray[Position], AArray[Position+Count], CTail * SizeOf(Pointer));
end;

procedure PArrayDelete(var AArray: TPointerArray; Position: Integer; Count: Integer = 1);
var L, CTail: Integer;
begin
 L:= Length(AArray);
 if (L = 0) or (Count = 0) or (Position >= L) or ((Position+Count) > L) then Exit;
 CTail:= L - (Position + Count);
 if CTail > 0 then
  Move(AArray[Position+Count], AArray[Position], CTail * SizeOf(Pointer));
 SetLength(AArray, L - Count);
end;

function PArrayMove(var AArray: TPointerArray; FromIndex, ToIndex: Integer; Count: Integer = 1): Boolean;
var L, Size, CT: Integer;
    Buff: Pointer;
begin
 Result:= False;
 L:= High(AArray);
 if (FromIndex > L) or (ToIndex > L+1) or
  ((ToIndex >= FromIndex) and (ToIndex <= (FromIndex+Count)))  then Exit;
 Size:= Count * SizeOf(Pointer);
 GetMem(Buff, Size);
 Move(AArray[FromIndex], Buff^, Size);
 if FromIndex > ToIndex then begin
  CT:= FromIndex - ToIndex;
  Move(AArray[ToIndex], AArray[FromIndex+Count-CT], CT * SizeOf(Pointer));
  Move(Buff^, AArray[ToIndex], Size);
 end
 else begin
  CT:= ToIndex - FromIndex - Count;
  Move(AArray[FromIndex+Count], AArray[FromIndex], CT * SizeOf(Pointer));
  Move(Buff^, AArray[FromIndex+CT], Size);
 end;
 FreeMem(Buff);
 Result:= True;
end;