Pętla i jej czas wykonania

0

Nie za bardzo wiedziałem jak nazwać ten temat i gdzie go umieścić (Hrdware/Software czy Delphi, jak zły dział, proszę przesunąć). Ogólnie. Napisałem program "bazodanowy", gdzie baza jest oparta na własnym formacie. Plik bazy ma 34MB (zaokrąglenie). Jego struktura jest następujaca:

 PRaportPrasy = ^TRaportPrasy;
 TRaportPrasy = record
   Odpad        :TOdpad;
   Naglowek     :TNaglowek;
   StatusCzesci :array [1..MAX_PARTS_COUNT] of TStatusCzesci;
   Wyniki       :TWyniki;
 end; // TRaportPrasy

 // suma zmian z1 + z2
 PRaportDzienny = ^TRaportDzienny;
 TRaportDzienny = array [1..2] of TRaportPrasy;

 // suma dni w miesiącu
 // 31 dni * 2 zmiany
 PRaportMiesieczny = ^TRaportMiesieczny;
 TRaportMiesieczny = array [1..31] of TRaportDzienny;

 // suma miesięcy w roku
 // 12 miesiecy * 31 dni (* 2 zmiany)
 PRaportRoczny = ^TRaportRoczny;
 TRaportRoczny = array [1..12] of TRaportMiesieczny;

 // suma całości produkcji 8 maszyn * 12 miesięcy * 31 dni * 2 zmiany
 PRaport = ^TRaport;
 TRaport = array[1..8] of TRaportRoczny;

Jest ona przeszukiwana na różne soposoby, w zależności od typu raportu: wg maszyny, operatora, miesiąca itp. procedura szukająca to nic innego jak pętla w stylu:

  for i := 1 to 8 do // maszyna
   begin
    BlockRead(F, RaportRoczny^, SizeOf(TRaportRoczny));
    for j := 1 to 31 do // dzień miesiąca
     begin
      for k := 1 to 2 do // zmiana
       begin
        with RaportRoczny^[n, j, k] do
         begin
          Inc(MonthData^[1, j], Wyniki.ALL);
          Inc(MonthData^[2, j], Wyniki.NG);
          // MonthData^[3, j] -> NG %
          Inc(MonthData^[4, j], Wyniki.OK);
          // monthData^[5, j] -> OK %
          Inc(MonthData^[6, j], Odpad.KapaBrudna);
          Inc(MonthData^[7, j], Odpad.KapaCzysta);
          Inc(MonthData^[8, j], Odpad.Symetryk);
          Inc(MonthData^[9, j], Odpad.Asymetryk);
          if Wyniki.ALL <> 0 then
             for w := 1 to Wyniki.ALL do
              for z := 1 to ScrapCount do
               if (StatusCzesci[w].KodZlomu.Kod = ScrapList^[z].ID) and
                  (ScrapList^[z].ID <> '') then
                  begin
                   Inc(MonthData^[z+9, j]);
                   Break;
                  end;
         end; // with Raport...
       end; // for k...
     end; // for j...
   end; // for i...

I tu dochodzę do sedna problemu. Procedura szukająca zwraca wyniki w MonthData (array [1..110, 1..31] of Single). Do zrobienia rankingu jest ona wywoływana w pętli (wiem, że to nie jest optymalne, ale czas gonił). Np. dla operatora:

for i := 1 to OprCount do
 NameSum('Baza.odb', Styczen, OprNr[i], Maszyna1: Word var Tab :TTab);

Pętla wykonuje się w wątku dziedziczącym po TThread. Może coś przez ten wątek jest nie tak?

I teraz: u mnie na komputerze z IntelCeleron D310 (2.13GHz, 1GB Ram (4x256MB w dualu)) dla 14 nazwisk raport generował się 17 s. W pracy na IBM Think Pad z Intel (nazwa zapomniana ;-) ) 1.7GHz, 1GB Ram (1x1GB DDR) raport generował się 5min 38 s. Skąd taka różnica? Rozumiem wszystko, wolniejsz dysk, wolniejszy procesor, ale ta różnica jest kolosalna. Pojęcia nie mam co może byc powodem.

Na koniec: dziękuję wszystkim, którzy przebrnęli przez ten opis ;-)

0

pojęcia nie mam skąd ta różnica ale może powstawiaj po każdej pętli zapisywanie czasu jej wykonania i ilość przebiegów i zobacz czy wydłuża się ogólnie każda pętla i suma sumarum tak wychodzi czy może któraś konkretna tak spowalnia

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