Optymalizacja kodu

0

Witam,
zrobiłem prosty program posiadający dwa pola memo i button 'oblicz' oraz menu -> new,open,save.
Przez open wgrywam plik tekstowy składający się z kolumny danych (wartości rzeczywiste) np. 10 liczb. Po kliknięciu 'oblicz' :

  • czytam dwie kolejne wartości z memo1
  • wyznaczam funkcję y = ax+b
  • generuję określoną liczbę punktów pomiędzy wartościami z memo1 i dodaję do memo2
    Operacja 'oblicz' trwa kilkadziesiąt sekund dla 200 danych z memo1 i podziałem przedziału na 200 części.
    Czy da się to jakoś przyspieszyć? Ostatecznie zależy mi na zapisaniu tego do pliku txt w postaci kolumny z kropką jako separatorem dziesiętnym (a nie przecinkiem jak robi to winda)
    Oto procedura:
 
procedure TForm1.Button1Click(Sender: TObject);
var
  i, x, Span, licz, step1, tmp : integer;
  a, b : real;
  y1, y2, y : real;
  text : string;

begin
    Randomize;
    licz := 0;
    memo2.Lines[0] := memo1.Lines[0];
    licz := licz + 1;
    Step1 := StrToInt(Step.Text);
    tmp := Round(10000 / step1);
    //tmp := tmp - 1;
    Span := StrToInt(RandomSpan.Text);


  for I := 0 to memo1.Lines.Count-2  do
  begin
    y1 := StrToFloat(memo1.Lines[I]) * 1000;    // przejscie z [m] na [mm]

    y2 := StrToFloat(memo1.Lines[I+1]) * 1000;

    a := y2 - y1;
    a := a / 10000;
    b := y1;
    for x := 1 to tmp do
      begin
        y := (a * (x* step1)) + b;
        y := y + Random (Span);
        y := y / 1000;
        text := FloatToStr(y);
        memo2.Lines.Add(text);
        //if (x = tmp) then
        if (I = memo1.Lines.Count-1) then
          if x = tmp then
            memo2.Lines.Add(memo1.Lines[I+1]);
        licz := licz + 1;
        Form1.Label1.Caption := IntToStr(licz);
      end;

  end;
end;

z góry dzięki

0

przede wszystkim nie trzymaj danych w memo tylko w tablicy.
memo nie jest od tego. i pamietaj ze kazda zamiana string->real i odwrotnie zajmuje troche czasu.
poza tym: jesli juz cos robisz na memo to na samym poczatku procedury daj Memo.Lines.BeginUpdate; a potem EndUpdate. to znacznie przyspieszy dodawanie nowych linii do memo i ogolnie wszystkie zmiany w nim wykonywane.

0

Bardzo słuszna porada!
Uważam, że szczególnie sekwencja BeginUpdate - EndUpdate znacznie przyśpieszy wykonanie procedury.

A jeśi chcesz zapisać wyniki do pliku txt w postaci kolumny z kropką jako separatorem dziesiętnym to wystarczy w OnCreate formy wykonać

DecimalSeparator:='.';
0

Dzięki,
kropka działa i po dodaniu update trzeba krócej czekać. Przerobieniem memo na tablicę zajmę się później. Dzięki za porady. pzd

0

Poza tym RANDOMIZE! Randomize może być wywołane tylko raz podczas działania programu, aby odpowiednio działało. A Ty wywołujesz to pod przyciskiem. Ma być w OnCreate

1 użytkowników online, w tym zalogowanych: 0, gości: 1