MainframeSupports
tip uge 26/2005:

Nogen gange bliver jeg ret overrasket over, hvad det egentlig er, der får programmer til at bruge meget CPU. Jeg har en tendens til at skyde skylden på DB2. Derfor har jeg altid gået meget op i at tune DB2 kald. Der findes dog andre syndere, eksempelvis ganske simple assignment statements.

I COBOL er et assignment statement en MOVE A TO B. I PL/1 og stort set alle andre programmeringssprog er det tilsvarende statement B = A. Sådan et simpelt statement kan da umuligt koste noget videre. Jo, det kan det, hvis B er tilstrækkelig stor. Den typiske grænse for B er 32767 bytes og uanset længden af A så vil de fleste programmeringssprog sørge for at alle 32767 bytes i B udfyldes, når der refereres til B uden yderligere angivelser. Tro det eller ej, men det er langt billigere at udfylde 100 bytes end 32767 bytes. Derfor er det værd at overveje om man kan definere B kortere eller kun udfylde den del af B, der faktisk anvendes.

Hvis B er en variabel længde tegnstreng, så vil A blive overflyttet til B og længden af B vil blive sat til længden af A. Derfor skal man overveje at erklære B som en variabel længde tegnstreng, hvis det er muligt. En anden mulighed er at angive, hvor stor en del af B, man vil udfylde med A. I COBOL gøres det således:

MOVE A TO B(1:LENGTH OF A)
og i PL/1 således:
SUBSTR(B,1,LENGTH(A)) = A;

Selvfølgelig kan man bare benytte en variabel eller en konstant med den ønskede længde i stedet for LENGTH. I ovenstående tilfælde skal man så selvfølgelig have en variabel, der holder styr på, hvor stor en del af B, der rent faktisk er udfyldt med noget fornuftigt.

Besparelserne ved at lave ovenstående simple ændring kan være ret dramatiske. I et ellers simpelt program sparede jeg eksempelvis 50% af CPU-tiden for hele programmet ved at foretage den beskrevne ændring i et eneste assignment statement uden, at det ændrede ved programmets funktion i øvrigt. I stedet for hver gang at flytte 32767 bytes, så flyttede assignment statementet efter rettelsen i gennemsnit 500 bytes hver gang.

Forrige danske tip        Last tip in english        Tip oversigten