Ответ на вопрос (жаль), для тех, у кого нет времени, чтобы попасть в него, но может иметь схожие проблемы.Почему мой код так медленно?
Правило № 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, который также медленно ;-)
около 3600 строк в таблице это занимает 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;
Лучшим способом подойти ответ является каким-то своим кодом. Кроме того, нет понятия, сколько строк должно быть возвращено 'select * from time_stamp'; может быть, это миллион строк? – 9000
+1 Спасибо. Любые рекомендации по профилированию? В этом случае я делал измерения с интервалом в одну секунду в течение примерно одного часа (плюс/минус несколько секунд) – Mawg
Вам следует попробовать SamplingProfiler, доступный по адресу http://delphitools.info/samplingprofiler. Это дает вам хороший взгляд на то, на что тратит ваша программа время, хорошо работает с приложениями Delphi, и это бесплатно. :) –