晕,delphi保存数据的速度怎么比VB慢那么多?
我做了一个测试程序,,用来测试VB 和DELPHI 保存1000条数据的速度,,为什么DELPHI的速度,竟然比VB慢那么多!!不是说DELPHI操作数据库的速度是最快的吗??
测试结果,同时保存1000条数据,VB平均用1562毫秒,delphi 用13156毫秒!!!
测试程序如下:
tab_gops_data 表里面已经有数据265674条数据了
(1)delphi:
在DataModule2里建有一个TAdoQuery表,属性sql: select * from tab_gps_data
procedure TForm1.Button3Click(Sender: TObject);
var i:integer;
pp:double;
ss:string;
begin
DataModule2.qry1.Active :=true;
pp:=GetTickCount();
for i:=1 to 1000 do
begin
DataModule2.qry1.Append ;
DataModule2.qry1.FieldByName( 'deviceid ').AsString:= '212121 ';
DataModule2.qry1.FieldByName( 'Lng ').AsString:= '120.36384 ';
DataModule2.qry1.FieldByName( 'Lat ').AsString:= '36.111021 ';
DataModule2.qry1.FieldByName( 'Speed ').AsString:= '21.3 ';
DataModule2.qry1.FieldByName( 'Direction ').AsString:= '97 ';
DataModule2.qry1.FieldByName( 'DateTime ').AsDateTime :=date;
DataModule2.qry1.Post;
end ;
pp:=GetTickCount()-pp;
ss:=floattostr(pp);
showmessage( ss);
end;
(2)vb测试程序:
Private Sub Form_Load()
Dim CCString As String
CCString = "Provider=SQLOLEDB.1;Password=feng;Persist Security Info=True;User ID=sa;Initial Catalog=GPSBase;Data Source=127.0.0.1 "
rst.Open "Tab_GPS_Data ", CCString, adOpenKeyset, adLockOptimistic, adCmdTable
End Sub
Private Sub Command1_Click()
'存数据库
iii = 0
Dim k
Dim i As Integer
Label1.Caption = GetTickCount
k = Val(Label1.Caption)
For i = 1 To 1000
rst.AddNew
rst!DeviceID = "000026 "
rst!Lat = "36.123456 "
rst!Lng = "120.36547 "
rst!speed = Left( "235.12 ", 3)
rst!Direction = "125 "
rst!DateTime = Now
rst.Update
Next i
Label2.Caption = GetTickCount & "- " & (GetTickCount - k)
End Sub
[解决办法]
// 又重写了段代码试了下,qry1是TADOCommand;
var
ss, sDate: string;
pp, i, J: Integer;
begin
ss := 'insert into testeffice values( ' '212121 ' ', ' '120.36384 ' ', ' '36.111021 ' ', ' '21.3 ' ', ' '97 ' ', ' '%s ' '); ';
pp := GetTickCount();
J := 0;
while J < 10 do
begin
qry1.CommandText := ' ';
for i := 1 to 100 do
begin
sDate := DateToStr(Now);
qry1.CommandText := qry1.CommandText + Format(ss, [sDate]);
end;
qry1.Execute;
Inc(J);
end;
pp := GetTickCount() - pp;
ss := floattostr(pp);
Memo1.Lines.Add(ss);
end;
[解决办法]
一组数据三十条,需要一条一条分析,实际上这个操作是在本机,如果没有特别的文件等慢速IO设备的操作,速度是可以忽略的,而访问数据库则尽可能减少访问次数来保证效率。
procedure AppendData(SrcData:array of TDataType;//源数据组
ADOCommand:TADOCommand;//执行SQL语句的组件
);
var
CommandString : TStringList;//SQL语句列表
begin
CommandString:=TStringList.Create;//创建对象
try
for i:=0 to sizeof(SrcData)-1 do //对源数据组进行独分析
begin
SingleSQL := AnalyData(SrcData[i]); //单个数据分析并生成一个SQL语句;
if Length(SingleSQL)> 0 then
CommandString.Add(SingleSQL+ '; ');//MSSQL多个SQL间使用分号分隔类似查询分析器当中的 "GO "
end;
ADOCommand.CommandText:=CommandString.Text; //批量SQL
ADOCommand.Execute; //执行批量
finally
CommandString.Free; //使用try ... finally来保证资源被释放
end;
end;