各位大神好,剛剛裝的XE7想試一下泛型別,在測驗時卻發現TList<T>和TObjectList<T>的效率差別太大,用TObjectList<T>完成相同作業3000次是600MS,用TList<T>卻是幾十秒,求大神指點迷津!
下面是代碼:
//定義TlogInfo類
type
TLogInfo = class
clientIndex: DWORD;
opCode: WORD;
packetData: array [0..99000] of AnsiChar;
JID: DWORD;
charName: array [0..17] of AnsiChar;
end;
//定義TLogInfoRecord結構
type
TLogInfoRecord = record
clientIndex: DWORD;
opCode: WORD;
packetData: array [0..99000] of AnsiChar;
JID: DWORD;
charName: array [0..17] of AnsiChar;
end;
//此方法需要幾十秒
procedure TForm1.Button5Click(Sender: TObject);
var
LogInfo: TLogInfoRecord;
tmpPAnsiChar: PAnsiChar;
i, time: Integer;
myList: Tlist<TLogInfoRecord>;
begin
//*使用Tlist<T>為記錄集的時候 不需要自己去釋放記憶體 用.clear 或者 delete(0) 都可以*/
time:=GetTickCount();
myList:=TList<TLogInfoRecord>.Create;
for i := 0 to 3000 do
begin
tmpPAnsiChar:=dumpMemory(dword(@Application),Length(LogInfo.packetData));
Move(tmpPAnsiChar[0],LogInfo.packetData[0],Length(LogInfo.packetData));
LogInfo.JID:= i;
//記錄LOGINFO
if myList.Count > 2000 then //如果大于指定尺寸則先洗掉第一個
begin
myList.Delete(0);
end;
myList.Add(LogInfo);
// Form1.memo1.Lines.Add(IntToStr(i) + ' ' +IntToStr(myList[i].JID));
// Sleep(10);
end;
Form1.memo1.Lines.Add('TList<T> as Record: ' + InttoStr(GetTickCount() - time));
myList.Clear;
end;
//此方法約600毫秒
procedure TForm1.TObjectListButtonClick(Sender: TObject);
var
LogInfo: TLogInfo;
tmpPAnsiChar: PAnsiChar;
i, time: Integer;
logInfoList1: TObjectList<TLogInfo>;
begin
time:= GetTickCount();
logInfoList1 := TObjectList<TLogInfo>.Create(True);
for i := 0 to 3000 do
begin
LogInfo:=TLogInfo.Create;
tmpPAnsiChar:=dumpMemory(dword(@Application),Length(LogInfo.packetData));
Move(tmpPAnsiChar[0],LogInfo.packetData[0],Length(LogInfo.packetData));
// Form1.MsgMemo.Lines.Add((PAnsiChar(@LogInfo.packetData)));
LogInfo.JID:= i;
// LogInfo.charName;
//記錄LOGINFO
if logInfoList1.Count > 2000 then //如果大于指定尺寸則先洗掉第一個
//下面兩個方法都可以
logInfoList1.Delete(0);
//logInfoList.Remove(logInfoList.First);
logInfoList1.Add(LogInfo);
// Form1.memo1.Lines.Add(IntToStr(i) + ' ' +IntToStr(logInfoList[0].JID));
// Sleep(100);
end;
Form1.memo1.Lines.Add('TObjectList<T> as Class: ' + InttoStr(GetTickCount() - time));
end;
uj5u.com熱心網友回復:
頂頂。。。睡醒了uj5u.com熱心網友回復:
TObjectList你存放的是指標(類物件),但TList存放的結構體實體,主要消耗時間在結構體實體復制上了,也就是這個packetData: array [0..99000] of AnsiChar;復制需要消耗大量時間,所以你TList也要存結構體指標才有可比性。myList: Tlist<^TLogInfoRecord>;
uj5u.com熱心網友回復:

一般泛型使用中,都不用結構體,因為結構體存在著記憶體復制賦值,不是地址參考
uj5u.com熱心網友回復:
我奇怪為啥TLIST里不用<TLogInfo>呢?難道上面的例子具有可比性么?就好像西瓜和柚子比,皮也不一樣,瓤子也不一樣。uj5u.com熱心網友回復:
指標確實快很多uj5u.com熱心網友回復:
沒用過那么高的版本的delphi 友情幫頂轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/90320.html
標籤:VCL組件開發及應用
