Tabell-deklaration med OCCURS

I detta forum kan frågor och tips ställas och ges.
Skriv svar [phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1275: count(): Parameter must be an array or an object that implements Countable
trumman
Newbie
Inlägg:3
Blev medlem:mån 12 jan 2004, 13:25
[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1275: count(): Parameter must be an array or an object that implements Countable

Inlägg av trumman » tis 20 jan 2004, 15:31

Se till att det finns en nivå för hela tabellen och en för ett OCCURS-entry tex:

Kod: Markera allt


05 T2-TABLE.
    10 T2-ENTRY   OCCURS   50.
       15 BLABLA                   PIC X(6).
       15 BLABLABLA                PIC X(6).


Då kan man göra INITIALIZE T2-TABLE för att initiera hela tabellen enkelt
OBS att FILLER ej initieras (man kan börja med MOVE SPACE TO T2-TABLE)

Man kan räkna ut antalet entries i tabellen
COMPUTE T2-NBR-OF-ENTRIES = LENGTH OF T2-TABLE / LENGTH OF T2-ENTRY

för att använda i villkor

PERFORM VARYING X-T2 FROM +1 BY +1 UNTIL X-T2 > T2-NBR-OF-ENTRIES

Michael Simpson
Newbie
Inlägg:7
Blev medlem:ons 14 jan 2004, 12:00
[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1275: count(): Parameter must be an array or an object that implements Countable

Inlägg av Michael Simpson » fre 23 jan 2004, 14:05

Jag har sett kommentarer där tabellen är stor att det är bättre/snabbare att göra så här i stället

Kod: Markera allt



initialize                t2-entry (1)
perform varying etc etc etc
  move t2-entry (1)            to t2-entry(i)
end-perform



Användarvisningsbild
Manor
Administrator
Inlägg:102
Blev medlem:lör 10 jan 2004, 15:14
Ort:Åkersberga
Kontakt:

Inlägg av Manor » lör 24 jan 2004, 19:02

Hej Michael !

Inte helt säkert, utan mest beroende på hur smart kod som Cobolkompilatorn genererar. Jag gjorde en test på SEB som jag analyserade med Strobe:

Detta gäller alltså den version av Cobol-kompilator vi använder på SEB.
COBOL/370 -- (IBM COBOL for OS/390 & VM 2.2.2).

Kod: Markera allt

Working-storage section.

*--- tre identiska tabeller ---*

 01  T1-TAB.                                
     05 T1-ENTRY OCCURS 1700.               
        10 T1-GCS-HOTELL-ID       PIC X(80).
        10 T1-DATUM               PIC X(10).
 01  T2-TAB.                                
     05 T2-ENTRY OCCURS 1700.               
        10 T2-GCS-HOTELL-ID       PIC X(80).
        10 T2-DATUM               PIC X(10).
 01  T3-TAB.                                
     05 T3-ENTRY OCCURS 1700.               
        10 T3-GCS-HOTELL-ID       PIC X(80).
        10 T3-DATUM               PIC X(10).


Procedure Division.

B-INITIERA-TAB1 SECTION.                               
    INITIALIZE  T1-TAB                                 
    .                                                  

C-INITIERA-TAB2 SECTION.                               
    PERFORM VARYING X-T2 FROM 1 BY +1 UNTIL X-T2 > 1700
       INITIALIZE T2-ENTRY (X-T2)                      
    END-PERFORM                                        
    .                                                  

D-INITIERA-TAB3 SECTION.                               
    INITIALIZE T3-ENTRY (1)                            
    PERFORM VARYING X-T3 FROM 2 BY +1 UNTIL X-T3 > 1700
       MOVE T3-ENTRY (1) TO T3-ENTRY (X-T3)            
    END-PERFORM                                        
    .                                                  


Sektionerna B-, C- samt D- anropades 100000 gånger för att få upp CPU-tiden något. Den total CPU-tiden blev då 33,86 CPU-sekunder.

- initieringen av T1-TAB tog 26.06% av den totala CPU-tiden
- initieringen av T2-TAB tog 35.32% av den totala CPU-tiden
- initieringen av T3-TAB tog 37.64% av den totala CPU-tiden

Slutsatsen man kan dra är att den kod som genereras för en INITIALIZE av hela tabellen (B-INITIERA-T1) blir effektivare än egenkodade loop:ar. CPU-tiden för Tab2 och Tab3 ligger nog inom felmarginalen och är troligtvis relativt jämförbara.

Som sagt ovanstående gäller med den kompilator som vi använder. Andra kompilatorer (kompilatorversioner) kan fungera på annat sätt.

Tillägg:
1985 då COBOL-II kompilatorn just släppts tillkom INITIALIZE som ett nytt kommando (har jag åtminstone för mig :blink:...). På den tiden ansågs INITIALIZE vara ett "segt" kommando, och jag vet att åtminstone ett CASE-verktyg (HPS) genererade ut MOVE SPACE respektive MOVE ZERO istället för att använda INITIALIZE. I senare versioner ansågs dock INITIALIZE fungera betydligt bättre, och började användas i senare versioner.

mvh Mats N

Michael Simpson
Newbie
Inlägg:7
Blev medlem:ons 14 jan 2004, 12:00
[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1275: count(): Parameter must be an array or an object that implements Countable

Inlägg av Michael Simpson » mån 26 jan 2004, 12:45

Jag jobbade åt IBM i 12 år, som program utvecklare (IC/1 och IC/E om det är någon som minns dessa produkter).

Ditt exempel bara bekräftar verkligheten som vi hade, dvs, kunderna "klagade" över dålig performance i olika områden, varvid vi fick upp ögonen för detta och försökte fixa problemet.

Jag blir alltid lika fascinerat av "sanningar" i denna bransch. Man "skall inte" göra någonting på ett visst sätt eftersom det är så långsamt/dåligt (whatever). Oftast visar det sig att det gällde för 3 versioner sedan och är totalt irrelevant idag. T.ex . här på banken prodsätta vi PSB'er endast EN GÅNG I VECKAN !!! Missar man fönstret, så är det bara att snällt vänta tills veckan därpå, eller (i bästa fall) lånar ett annat PSB. Skälet till detta är säkert en "regel" som gällde för 10-15 år sedan - ingen har ifrågasatt den sedan dess !!!!

Förresten. Till moderatorn - som engelsman, är det okay om jag skriver mina inlägg på engelska i.s.f svenska. Jag skriver så mycket snabbare då.

Användarvisningsbild
Manor
Administrator
Inlägg:102
Blev medlem:lör 10 jan 2004, 15:14
Ort:Åkersberga
Kontakt:

Inlägg av Manor » mån 26 jan 2004, 15:54

Hej Michael !

Jag ser helst att forumet på cobol.se hålls på svenska, trots att de flesta säkerligen behärskar engelska tillräckligt bra...men hellre engelska inlägg än inga alls (om du förstår vad jag menar :rolleyes:).

mvh Mats N
PS. Vi (SEB) produktionssätter också bara PSB:er en gång i veckan.

Skriv svar
[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1275: count(): Parameter must be an array or an object that implements Countable
[phpBB Debug] PHP Warning: in file [ROOT]/vendor/twig/twig/lib/Twig/Extension/Core.php on line 1275: count(): Parameter must be an array or an object that implements Countable