Respuesta publicada (lo siento), para aquellos que no tienen tiempo para entrar pero que pueden tener problemas similares.¿Por qué mi código es tan lento?
Regla # 1, como siempre, mueva todo lo que pueda fuera de los bucles.
2, moviendo TField var: = ADODataSet.FieldByname() fuera del ciclo 3, ADODataSet.DisableControls(); y ADODataSet.EnableControls(); alrededor del ciclo 4, stringGrid.Rows [r] .BeginUpdate() y EndUpdate() en cada fila (no se puede hacer en el control) cada uno de estos se cortó unos segundos, pero Lo tengo abajo " más rápido que el ojo puede ver" cambiando
loop
stringGrid.RowCount := stringGrid.RowCount + 1;
end loop
a poner stringGrid.RowCount := ADODataSet.RecordCount;
antes del bucle
1 y sincero agradecimiento a todos los que ayudaron.
(Ahora voy a ir a ver lo que puedo hacer para optimizar la elaboración de un TChart, que también es lento ;-)
con cerca de 3.600 filas en la tabla de esto toma 45 segundos para poblar la cadena cuadrícula. ¿Qué estoy haciendo mal?
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();
actualización:
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;
La mejor manera de acercarse a la respuesta es al perfil de alguna manera su código. Además, no hay idea de cuántas filas debe devolver 'select * from time_stamp'; tal vez es un trillón de filas? – 9000
+1 Gracias. ¿Alguna recomendación sobre el perfil? En este caso, estaba tomando medidas a intervalos de un segundo durante aproximadamente una hora (más/menos unos segundos) – Mawg
Debe probar SamplingProfiler, disponible en http://delphitools.info/samplingprofiler. Le da una buena visión de lo que su programa está pasando tiempo, funciona bien con las aplicaciones Delphi, y es gratis. :) –