【发布时间】:2023-03-28 05:16:01
【问题描述】:
顶贴(抱歉)的答案,适合那些没有时间进入但可能有类似问题的人。
与往常一样,规则 1 尽可能多地移出循环。
2、将 TField var := ADODataSet.FieldByname() 移出循环
3、ADODataSet.DisableControls();和 ADODataSet.EnableControls();绕圈
4、每行上的stringGrid.Rows[r].BeginUpdate()和EndUpdate()(不能在控件上做)
这些中的每一个都剃掉了几秒钟,但是我通过更改将其归结为“比眼睛看到的更快”
loop
stringGrid.RowCount := stringGrid.RowCount + 1;
end loop
将stringGrid.RowCount := ADODataSet.RecordCount; 放在循环之前
+1 并衷心感谢所有提供帮助的人。
(现在我会去看看我能做些什么来优化绘制 TChart,这也很慢 ;-)
表格中有大约 3,600 行,填充字符串网格需要 45 秒。我做错了什么?
ADODataSet := TADODataSet.Create(Nil); ADODataSet.Connection := AdoConnection; ADODataSet.CommandText := 'SELECT * FROM 测量值'; ADODataSet.CommandType := cmdText; ADODataSet.Open(); 而不是 ADODataSet.eof 做 开始 TestRunDataStringGrid.RowCount := TestRunDataStringGrid.RowCount + 1; measureDateTime := UnixToDateTime(ADODataSet.FieldByname('time_stamp').AsInteger); DoSQlCommandWithResultSet('SELECT * FROM start_time_stamp', AdoConnection, resultSet); startDateTime := UnixToDateTime(StrToInt64(resultSet.Strings[0])); elapsedTime := 测量日期时间 - 开始日期时间; TestRunDataStringGrid.Cells[0, Pred(TestRunDataStringGrid.RowCount)] := FormatDateTime('hh:mm:ss', elapsedTime); TestRunDataStringGrid.Cells[1, Pred(TestRunDataStringGrid.RowCount)] := FloatToStrWithPrecision(ADODataSet.FieldByname('inputTemperature').AsFloat); TestRunDataStringGrid.Cells[2, Pred(TestRunDataStringGrid.RowCount)] := FloatToStrWithPrecision(ADODataSet.FieldByname('outputTemperature').AsFloat); TestRunDataStringGrid.Cells[3, Pred(TestRunDataStringGrid.RowCount)] := FloatToStrWithPrecision(ADODataSet.FieldByname('flowRate').AsFloat); TestRunDataStringGrid.Cells[4, Pred(TestRunDataStringGrid.RowCount)] := FloatToStrWithPrecision(ADODataSet.FieldByname('waterPressure').AsFloat * convert); TestRunDataStringGrid.Cells[5, Pred(TestRunDataStringGrid.RowCount)] := FloatToStrWithPrecision(ADODataSet.FieldByname('waterLevel').AsFloat); TestRunDataStringGrid.Cells[6, Pred(TestRunDataStringGrid.RowCount)] := FloatToStrWithPrecision(ADODataSet.FieldByname('cod').AsFloat); ADODataSet.Next; 结尾; ADODataSet.Close(); ADODataSet.Free();更新:
函数 DoSQlCommandWithResultSet(const command : String; AdoConnection : TADOConnection; resultSet : TStringList): Boolean; 变量 我:整数; AdoQuery:TADOQuery; 开始 结果:=真; 结果集.清除(); AdoQuery := TADOQuery.Create(nil); 尝试 AdoQuery.Connection := AdoConnection; AdoQuery.SQL.Add(命令); AdoQuery.Open(); 我:= 0; 而不是 AdoQuery.eof 做 开始 resultSet.Add(ADOQuery.Fields[i].Value); 我 := 我 + 1; AdoQuery.Next; 结尾; 最后 AdoQuery.Close(); AdoQuery.Free(); 结尾; 结尾;【问题讨论】:
-
解决问题的最佳方法是以某种方式分析您的代码。此外,不知道
select * from time_stamp应该返回多少行;也许是无数行? -
+1 谢谢。关于剖析有什么建议吗?在这种情况下,我以一秒的间隔进行测量大约一小时(加/减几秒)
-
您应该尝试使用 SamplingProfiler,网址为 delphitools.info/samplingprofiler。它可以让您很好地了解您的程序花时间在什么地方,它可以很好地与 Delphi 应用程序配合使用,而且它是免费的。 :)
-
你的程序越慢,就越容易找出原因。试试random-pausing。
-
@Mason:您链接到的分析器看起来可以做所有正确的事情。它在挂钟时间对堆栈进行采样,并按代码行给出百分比,类似于 RotateRight 的 Zoom。我会随机暂停,但我认为这种分析器绝对是次优的。
标签: delphi profiling ado tstringgrid