MyBaseを試してみる。(AppendとInsert)
インデックスで順番を処理するなら Append も Insert も同じ使い方ができますよね。そこで、ふと疑問に思ったのですが、Append と Insert、この二つの処理はどちらが早いのでしょうか。
ClientDataSet1->DataSource1->DBGrid1と接続し、下記のプログラムで100, 300, 500, 1000, 3000, 5000, 10000, 30000, 50000レコードを Append と Insert を使って追加し、計測してみました。(基本的に3回ずつ)
これらからおよそ10000回までの追加については、Insert、それ以上の場合には、Appendを使うといいかも知れません。テストのフィールドが単純なので、あくまでも参考データですけどね。
今回はGetTickCountで計測していますが、処理にかかった時間をより厳密に計算するには、timeGetTime を使います。
totonicaさんのサイト
Watercolor City
経過時間を計測する
ClientDataSet1->DataSource1->DBGrid1と接続し、下記のプログラムで100, 300, 500, 1000, 3000, 5000, 10000, 30000, 50000レコードを Append と Insert を使って追加し、計測してみました。(基本的に3回ずつ)
// サンプルデータを追加します。
procedure MakeSample(CDS: TClientDataSet);
var
No: Integer;
F: Boolean;
begin
F := CDS.Active;
if not F then
CDS.Open;
try
// サンプルデータの追加
No := 0;
with CDS do
begin
Inc(No);
Appendrecord([No, 'iPod Touch','mobile']);
Inc(No);
Appendrecord([No, 'Zaurus C-860','mobile']);
Inc(No);
Appendrecord([No, 'Delphi 2009 Handbook','book']);
Inc(No);
Appendrecord([No, 'GEORGIA BLACK','Coffee']);
CheckBrowseMode;
end;
finally
if not F then
CDS.Close;
end;
end;
// データベースの作成
procedure CreateDB(CDS: TClientDataSet);
var
I: Integer;
begin
CDS.Close;
CDS.FieldDefs.Add('ORD',ftInteger);
CDS.FieldDefs.Add('ITEM',ftWideString,20);
CDS.FieldDefs.Add('ITEM2',ftWideString,20);
CDS.IndexDefs.Add('OrderNo','ORD', [ixPrimary]);
CDS.CreateDataSet;
CDS.Close;
for I := 0 to CDS.FieldDefs.Count - 1 do
CDS.FieldDefs[I].CreateField(CDS);
// インデックスの設定
CDS.IndexName := 'OrderNo';
CDS.Open;
MakeSample(CDS);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
CreateDB(ClientDataSet1);
end;
const
K = 20000; // 回数
// Append
procedure TForm1.Button1Click(Sender: TObject);
var
T: Cardinal;
I: Integer;
begin
T := GetTickCount;
ClientDataset1.DisableControls;
try
for I := 0 to K-1 do
begin
ClientDataSet1.Append;
ClientDataSet1.FieldByName('ITEM').AsString := 'Test';
ClientDataSet1.FieldByName('ORD').AsInteger :=
ClientDataSet1.RecordCount+1;
end;
ClientDataset1.CheckBrowseMode;
finally
ClientDataset1.EnableControls;
end;
Memo1.Lines.Add('Append:'+IntToStr(K)+
FormatFloat(' #,##0 msec',GetTickCount-T));
end;
// Insert
procedure TForm1.Button2Click(Sender: TObject);
var
T: Cardinal;
I: Integer;
begin
T := GetTickCount;
ClientDataset1.DisableControls;
try
for I := 0 to K-1 do
begin
ClientDataSet1.Insert;
ClientDataSet1.FieldByName('ITEM').AsString := 'Test';
ClientDataSet1.FieldByName('ORD').AsInteger :=
ClientDataSet1.RecordCount+1;
end;
ClientDataset1.CheckBrowseMode;
finally
ClientDataset1.EnableControls;
end;
Memo1.Lines.Add('Insert:'+IntToStr(K)+
FormatFloat(' #,##0 msec',GetTickCount-T));
end;
[100回] Append:100 0 msec ------------------- Insert:100 0 msec [300回] Append:300 15 msec Append:300 0 msec Append:300 16 msec ------------------- Insert:300 0 msec Insert:300 16 msec Insert:300 0 msec [500回] Append:500 16 msec Append:500 15 msec Append:500 16 msec ------------------- Insert:500 0 msec Insert:500 0 msec Insert:500 0 msec [1000回] Append:1000 15 msec Append:1000 15 msec Append:1000 16 msec ------------------- Insert:1000 15 msec Insert:1000 15 msec Insert:1000 16 msec [3000回] Append:3000 47 msec Append:3000 46 msec Append:3000 46 msec ------------------- Insert:3000 31 msec Insert:3000 31 msec Insert:3000 31 msec [5000回] Append:5000 63 msec Append:5000 62 msec Append:5000 62 msec ------------------- Insert:5000 47 msec Insert:5000 47 msec Insert:5000 47 msec [10000回] Append:10000 109 msec Append:10000 109 msec Append:10000 109 msec --------------------- Insert:10000 109 msec Insert:10000 109 msec Insert:10000 110 msec [20000回] Append:20000 218 msec Append:20000 218 msec Append:20000 203 msec --------------------- Insert:20000 265 msec Insert:20000 281 msec Insert:20000 281 msec [30000回] Append:30000 312 msec Append:30000 312 msec Append:30000 343 msec --------------------- Insert:30000 499 msec Insert:30000 484 msec Insert:30000 483 msec [50000回] Append:50000 530 msec Append:50000 546 msec Append:50000 531 msec ----------------------- Insert:50000 1,108 msec Insert:50000 1,123 msec Insert:50000 1,123 msec [PC] CPU: Intel Core i5-2400 Mem: 4GB Delphi XE2 pro ※F9で実行させて、計測して終了させて、また実行させて計測して・・・(^-^)
これらからおよそ10000回までの追加については、Insert、それ以上の場合には、Appendを使うといいかも知れません。テストのフィールドが単純なので、あくまでも参考データですけどね。
今回はGetTickCountで計測していますが、処理にかかった時間をより厳密に計算するには、timeGetTime を使います。
totonicaさんのサイト
Watercolor City
経過時間を計測する
| 固定リンク
