我发现在我维护的应用程序中存在性能瓶颈,其中使用奇怪的技术来本地化用户界面。
名称值对存储在一个非常大的THashedStringList
中,并且通过对
THashedStringList.IndexOfName
和
THashedStringList.ValueFromIndex
不知何故,我希望有一个更快的类,以某种方式可以使用类似的签名(indexOfName
和ValueFromIndex
),这样我可以实现性能提升,而无需重写这个奇怪但有效的本地化机制。这段代码最初是用Delphi 2009编写的,我认为,但现在我有西雅图。
感谢。
答案 0 :(得分:-2)
我不能在这里发布代码(只是界面),因为它太大了,但是如果你继续使用alcinoe(https://github.com/Zeus64/alcinoe)你有一套类似于组件的TStringlist,特别是一个名为TALHashedStringList的与THashedStringList完全一样,但在内部使用TDictionnary(所以现在TALHashedStringList.IndexOfName和TALHashedStringList.ValueFromIndex的时间必须为null)
{----------------------------------}
TALHashedStringList = class(TALStrings)
private
FNodeList: TObjectList<TALHashedStringListDictionaryNode>;
FDictionary: TALObjectDictionary<ansiString, TALHashedStringListDictionaryNode>;
FDuplicates: TDuplicates;
FOnChange: TNotifyEvent;
FOnChanging: TNotifyEvent;
FOwnsObject: Boolean;
FCaseSensitive: boolean;
procedure ExchangeItems(Index1, Index2: Integer);
procedure QuickSort(L, R: Integer; SCompare: TALHashedStringListSortCompare);
procedure SetCaseSensitive(const Value: Boolean);
function GetCaseSensitive: Boolean;
Function ExtractNameValue(const S: AnsiString; var Name, Value: AnsiString): Boolean;
procedure SetDuplicates(const Value: TDuplicates);
function CreateDictionary(ACapacity: integer; aCaseSensitive: boolean): TALObjectDictionary<ansiString, TALHashedStringListDictionaryNode>;
protected
function GetName(Index: Integer): AnsiString; override;
function GetStrictName(Index: Integer): AnsiString; override; // [added from Tstrings]
function GetValue(const Name: AnsiString): AnsiString; override;
procedure SetValue(const Name, Value: AnsiString); override;
function GetValueFromIndex(Index: Integer): AnsiString; override;
procedure SetValueFromIndex(Index: Integer; const Value: AnsiString); override;
procedure SetPersistentValue(const Name, Value: AnsiString); override; // [added from Tstrings]
procedure SetPersistentValueFromIndex(Index: Integer; const Value: AnsiString); override; // [added from Tstrings]
procedure Changed; virtual;
procedure Changing; virtual;
function Get(Index: Integer): AnsiString; override;
function GetCount: Integer; override;
function GetObject(Index: Integer): TObject; override;
function GetTextStr: AnsiString; override;
procedure Put(Index: Integer; const S: AnsiString); override;
procedure PutObject(Index: Integer; AObject: TObject); override;
procedure SetCapacity(NewCapacity: Integer); override;
procedure SetUpdateState(Updating: Boolean); override;
procedure InsertItem(Index: Integer; const Name, Value: AnsiString; AObject: TObject); overload; virtual;
procedure InsertItem(Index: Integer; const S: AnsiString; AObject: TObject); overload; virtual;
procedure AssignTo(Dest: TPersistent); override; //[added from Tstrings]
procedure init(OwnsObjects: Boolean; ACapacity: Integer); virtual; //[added from TStringList]
public
constructor Create; overload; override;
constructor Create(OwnsObjects: Boolean); reintroduce; overload;
constructor Create(ACapacity: Integer); reintroduce; overload; //[added from Tstrings]
constructor Create(OwnsObjects: Boolean; ACapacity: Integer); reintroduce; overload; //[added from Tstrings]
destructor Destroy; override;
function Add(const S: AnsiString): Integer; override;
function AddObject(const S: AnsiString; AObject: TObject): Integer; override;
function AddNameValue(const Name, Value: AnsiString): Integer; override; // [added from Tstrings]
function AddNameValueObject(const Name, Value: AnsiString; AObject: TObject): Integer; override; // [added from Tstrings]
procedure Assign(Source: TPersistent); override;
procedure Clear; override;
procedure Delete(Index: Integer); override;
function ExtractObject(Index: Integer): TObject; overload; virtual;
procedure Exchange(Index1, Index2: Integer); override;
function IndexOf(const S: AnsiString): Integer; override;
function IndexOfName(const Name: AnsiString): Integer; override; // [added from TStringList]
procedure Insert(Index: Integer; const S: AnsiString); override;
procedure InsertObject(Index: Integer; const S: AnsiString; AObject: TObject); override;
procedure InsertNameValue(Index: Integer; const Name, Value: AnsiString); override; // [added from Tstrings]
procedure InsertNameValueObject(Index: Integer; const Name, Value: AnsiString; AObject: TObject); override; // [added from Tstrings]
procedure Move(CurIndex, NewIndex: Integer); override;
procedure CustomSort(Compare: TALHashedStringListSortCompare); virtual;
property Duplicates: TDuplicates read FDuplicates write SetDuplicates;
property CaseSensitive: Boolean read GetCaseSensitive write SetCaseSensitive;
property OnChange: TNotifyEvent read FOnChange write FOnChange;
property OnChanging: TNotifyEvent read FOnChanging write FOnChanging;
property OwnsObjects: Boolean read FOwnsObject write FOwnsObject;
end;
你可以看到这个演示的表现: https://svn.code.sf.net/p/alcinoe/code/demos/ALSortedListBenchmark/win32/ALSortedListBenchmark.exe