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 ;-)