gpt4 book ai didi

delphi - 为什么我的代码这么慢?

转载 作者:行者123 更新时间:2023-12-03 15:02:52 24 4
gpt4 key购买 nike

置顶(抱歉)答案,适合那些没有时间了解但可能遇到类似问题的人。

规则#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 measurements';   ADODataSet.CommandType := cmdText;   ADODataSet.Open();   while not ADODataSet.eof do   begin      TestRunDataStringGrid.RowCount := TestRunDataStringGrid.RowCount + 1;      measurementDateTime   := UnixToDateTime(ADODataSet.FieldByname('time_stamp').AsInteger);      DoSQlCommandWithResultSet('SELECT * FROM start_time_stamp', AdoConnection, resultSet);      startDateTime := UnixToDateTime(StrToInt64(resultSet.Strings[0]));      elapsedTime   := measurementDateTime - startDateTime;      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;   end;   ADODataSet.Close();   ADODataSet.Free();

更新:

Function  DoSQlCommandWithResultSet(const command : String; AdoConnection : TADOConnection; resultSet : TStringList): Boolean;  var        i : Integer;        AdoQuery : TADOQuery;begin  Result := True;  resultSet.Clear();  AdoQuery := TADOQuery.Create(nil);  try    AdoQuery.Connection := AdoConnection;    AdoQuery.SQL.Add(command);    AdoQuery.Open();    i := 0;    while not  AdoQuery.eof do    begin      resultSet.Add(ADOQuery.Fields[i].Value);      i := i + 1;      AdoQuery.Next;    end;  finally    AdoQuery.Close();    AdoQuery.Free();  end;end;

最佳答案

  1. 您正在执行命令 SELECT * FROM start_time_stamp 3,600 次,但在我看来,它与您的外循环没有任何关联。为什么不在循环之前执行一次?

  2. 该 SELECT 命令似乎只返回单个记录的单个列,但您使用“*”加载所有列,并且没有 WHERE 子句将结果限制为单个行(如果有多个记录)表中的行)。

  3. 您仅使用测量中有限数量的列,但您会检索带有“*”的所有列。

  4. 您没有显示 DoSQlCommandWithResultSet 的内容,因此不清楚该例程是否存在问题。

  5. 目前尚不清楚问题是出在数据库访问还是字符串网格中。注释掉与字符串网格相关的所有行并运行程序。仅数据库访问需要多长时间?

关于delphi - 为什么我的代码这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4765931/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com