title: Why is my code so slow?
body: <p>Top-posted (sorry) answer, for those who don't have time to get into it but may have similar problems.</p>
  
  <p>Rule #1, as always, move as much as you can out of loops.<br>
  2,  moving TField var := ADODataSet.FieldByname()  out of the loop
  3, ADODataSet.DisableControls(); and ADODataSet.EnableControls(); around the loop
  4, stringGrid.Rows[r].BeginUpdate() and EndUpdate() on each row (cannot do on teh whle control)
  each of these shaved off a few seconds, <em>but</em> I got it down to "faster than the eye can see" by changing  </p>
  
  <pre><code>loop
    stringGrid.RowCount := stringGrid.RowCount + 1;
  end loop
  </code></pre>
  
  <p>to putting <code>stringGrid.RowCount := ADODataSet.RecordCount;</code> before the loop</p>
  
  <p>+1 and heartfelt thanks to all who helped.</p>
  
  <p>(now I will go and see what I can do to optimize drawing a TChart, which is also slow ;-)</p>
  
  <hr>
  
  <p>with about 3,600 rows in the table this takes 45 seconds to populate the string grid. What am I doing wrong?</p>
  
  <pre>
     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();
  </pre>
  
  <p>update:</p>
  
  <pre>
  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;
  
  </pre>