[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jun 2006
    Beiträge
    348

    Performance bei MI Aufrufen

    Hallo Leute,

    aktuell beschäftige ich mich mit der MI Programmierung. Dabei habe ich gelernt, dass man MI-Funktionen direkt aus ILE Cobol aufrufen kann. Auf diversen Webseiten wird berichtet, dass die MI-Aufrufe schneller sein sollen, als vergleichbare C-Funktionen.

    Das habe ich nun auf meiner 170er (2292, V5R2) getestet und bin erstaunt, dass das Programm mit dem MI-Aufruf am meisten CPU benötigt.

    Getestet habe ich die C-Funktion pow(), in MI die Funktion _POWER und in Cobol der Operator ** innerhalb einer COMPUTE Anweisung.

    Hier die ILE Cobol Test-Sourcen:
    Code:
           IDENTIFICATION DIVISION.                      
             PROGRAM-ID.              CLCPOW.            
           ENVIRONMENT DIVISION.                         
            CONFIGURATION SECTION.                       
           INPUT-OUTPUT SECTION.                         
             FILE-CONTROL.                               
           DATA DIVISION.                                
            FILE SECTION.                                
           WORKING-STORAGE SECTION.                      
           01  WERT-A COMP-2.                            
           01  WERT-B COMP-2.                            
           LINKAGE SECTION.                              
           PROCEDURE DIVISION.                           
           STEUER SECTION.                               
           ANFANG.                                       
               MOVE 50 TO WERT-B.                        
               PERFORM  999999 TIMES                     
                        MOVE 5000 TO WERT-A              
                        COMPUTE WERT-A = WERT-A ** WERT-B
               END-PERFORM.                              
           ENDE.                                         
               GOBACK.
    Code:
           PROCESS NOMONOPRC.                                     
           IDENTIFICATION DIVISION.                               
             PROGRAM-ID.              CLCPOWC.                    
           ENVIRONMENT DIVISION.                                  
            CONFIGURATION SECTION.                                
           INPUT-OUTPUT SECTION.                                  
             FILE-CONTROL.                                        
           DATA DIVISION.                                         
            FILE SECTION.                                         
           WORKING-STORAGE SECTION.                               
           01  WERT-A COMP-2.                                     
           01  WERT-B COMP-2.                                     
           LINKAGE SECTION.                                       
           PROCEDURE DIVISION.                                    
           STEUER SECTION.                                        
           ANFANG.                                                
               MOVE 50 TO WERT-B.                                 
               PERFORM  999999 TIMES                              
                        MOVE 5000 TO WERT-A                       
                        CALL PROCEDURE "pow" USING BY VALUE WERT-A
                                                            WERT-B
                             RETURNING WERT-A                     
                        END-CALL                                  
               END-PERFORM.
           ENDE.           
               GOBACK.
    Code:
           PROCESS NOMONOPRC.                                  
           IDENTIFICATION DIVISION.                            
             PROGRAM-ID.              CLCPOWMI.                
           ENVIRONMENT DIVISION.                               
            CONFIGURATION SECTION.                             
            SPECIAL-NAMES.    LINKAGE TYPE IS SYS FOR "_POWER".
           INPUT-OUTPUT SECTION.                               
             FILE-CONTROL.                                     
           DATA DIVISION.                                      
            FILE SECTION.                                      
           WORKING-STORAGE SECTION.                            
           01  WERT-A COMP-2.                                  
           01  WERT-B COMP-2.                                  
           LINKAGE SECTION.                                    
           PROCEDURE DIVISION.                                 
           STEUER SECTION.                                     
           ANFANG.                                             
               MOVE 50 TO WERT-B.                              
               PERFORM  999999 TIMES                           
                        MOVE 5000 TO WERT-A                    
                        CALL "_POWER" USING BY VALUE WERT-A    
                                                     WERT-B    
                             RETURNING WERT-A                  
                        END-CALL
               END-PERFORM.     
           ENDE.                
               GOBACK.
    Hier die Auswertung eines Aufrufes als Batchjob. Verbrauchte CPU und Laufzeit per Accounting Journal QACGJRN ausgewertet:
    Programm
    CPU Zeit in Sek.
    Dauer in Sek.
    CLCPOW 2,350 2,582
    CLCPOWC 4,145 4,335
    CLCPOWMI 8,044 9,872

    Kann mir jemand erklären, weshalb der MI Aufruf so langsam ist?

    Viele Grüße
    Matthias

  2. #2
    Registriert seit
    Nov 2002
    Beiträge
    173
    Moien Matthias,

    ist nur eine Vermutung und vielleicht sogar Nonsens (von daher möge man mich bitte ggf. berichtigen), aber ich vermute, dass es da einen Overhead beim Aufruf der MI Funktion aus der ILE Runtime heraus gibt.

    Wir hatten dasselbe Spiel mal, als unser Pfeifendeckel-Softwarelieferant versucht hatte, die Performance seines in komplett monolithischem OPM Cobol geschriebenen Softwarepakets zu verbessern, indem er einfach nur diverse Programme 1:1 von OPM in ILE umgesetzt hat (also nur minimalste Code-Anpassungen, um das entsprechende Programm in ILE statt OPM compilieren zu können). Das hatte zur Folge, dass jedes Mal, wenn ein ILE Programm aus einem OPM Programm heraus per dynamischem Call aufgerufen wurde, die ILE Runtime aktiviert und initialisiert werden musste, insofern sie nicht schon im Call Stack vorhanden war => riesen Performanceeinbussen, klassisches Eigentor geschossen.

    Ich vermute daher, dass etwas Ähnliches in deinem Beispielprogramm vonstatten geht. Sieht mir so aus, als würde da jedes Mal etwas für die Ausführung der MI Funktion initialisiert und danach wieder finalisiert/"zugemacht", d.h. es wäre in diesem Fall gar nicht die _POWER Funktion an sich, die langsam ist, sondern das Drumherum.

    Änder mal zum Test dein Programm und schreib die Iteration der _POWER Funktion im aufgerufenen MI Programm statt im Cobol, dann wird mans ja sehen.

    Grüsse

    bateau

  3. #3
    Registriert seit
    Jun 2006
    Beiträge
    348
    Hallo bateau,

    danke für deine Antwort.
    Bzgl. OPM -> ILE. Da wurde wohl beim Aufruf die Aktivierungsgruppe (z.B. QILE) erzeugt und beim Verlassen wieder aufgeräumt, da im Call Stack kein anderes Programm mit gleicher Aktivierungsgruppe vorhanden war.

    Die Schleife in MI zu programmieren, ist mir im Moment noch nicht möglich. Allerdings wäre mir der direkte Aufruf aus Cobol auch lieber.

    Schönen Sonntag noch.

    Gruß
    Matthias

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... bei der Benchmark ist nicht klar was sie eigentlich misst, da sie initialisierung und caching nicht korrekt abbildet. folgende Punkte würde ich ändern:
    - die Schleife zweimal laufen lassen und nur die 2. Messung nehmen (damit sind die Initialisierungen sicher weg.
    - statt fixe Werte random Werte potenzieren und zwar für alle 3 Varianten dieselben (gegen cahing Effekte)
    - damit man nicht die random Funktion misst, in der Initialisierung ein Array mit random Werten füllen, anschließend darüber die Schleife jeweils mit allen 3 Methoden (damit dieselben Berechnungen gemacht werden mussen).
    - letztlich noch die Reihenfolge der 3 Berechnungsmethoden variieren, um auszuschließen, dass einer den anderen schon konditioniert.
    Das Ganze natürlich am Besten bei unbelasteter Maschine.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  5. #5
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Falls es auch als OPM-COBOL-Programm geht, könntest du es mal mit CRTCBLPGM ... GENOPT(*XREF) wandeln und die erstellte MI-Quelle (in der Umwandlungsliste enthalten) untersuchen.

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Die Compiler erfinden ja auch nicht immer alles neu.
    Bei OPM-Cobol mit der Option *LIST wird die MI-Auflösung angezeigt. Ggf. verwendet COBOL ja schon die MI-Anweisung.

    C-Funktionen kann man nur in ILE aufrufen, da gibt's aber kein MI-Listing mehr.
    Sicherlich Erzeugst du Overhead beim Aufruf einer C-Funktion wobei die C-Funktion intern wohl wieder den MI-Befehl verwendet, die "MI-Funktion" wiederum ein Wrapper für den Aufruf des MI-Befehls ist.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    Jun 2006
    Beiträge
    348
    Beim Ausführen von COMPUTE x = y**z. befindet sich im Aufrufstapel die Funktion CEESDXPD.

  8. #8
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Etwas angepaßt und gewandelt als klassisches CBL steht in der MI-Umwandlungsliste, daß es die MI-Funktion CMF2 mit Steueroperand X"0001" aufruft. (CMF2 .PFLANSW,X"0001",.PFLBASE,.PFLPOWR)

  9. #9
    Registriert seit
    Jun 2006
    Beiträge
    348
    Zitat Zitat von BenderD Beitrag anzeigen
    ... bei der Benchmark ist nicht klar was sie eigentlich misst, da sie initialisierung und caching nicht korrekt abbildet. folgende Punkte würde ich ändern:
    - die Schleife zweimal laufen lassen und nur die 2. Messung nehmen (damit sind die Initialisierungen sicher weg.
    - statt fixe Werte random Werte potenzieren und zwar für alle 3 Varianten dieselben (gegen cahing Effekte)
    - damit man nicht die random Funktion misst, in der Initialisierung ein Array mit random Werten füllen, anschließend darüber die Schleife jeweils mit allen 3 Methoden (damit dieselben Berechnungen gemacht werden mussen).
    - letztlich noch die Reihenfolge der 3 Berechnungsmethoden variieren, um auszuschließen, dass einer den anderen schon konditioniert.
    Das Ganze natürlich am Besten bei unbelasteter Maschine.

    D*B
    Mich interessiert schon die Gesamtzeit inkl. Initialisierung und nicht nur die Zeit innerhalb der Funktion. Dann scheidet der Aufruf direkt aus Cobol wohl aus. Also besser ein reines MI-Programm schreiben, dann wird man wohl die beste Performance erzielen können.

    Danke für eure Antworten.

    Schönen 1. Advent noch.

  10. #10
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... wenn der COBOL Compiler z.B.: vernünftig optimiert, dann merkt er, dass Du immer dieselben Werte multiplizierst und macht das genau 1 mal!!! Um nur einen der Pferdefüße an Deiner "Benchmark" zu benennen.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Wie das halt immer so ist.
    Beim OPM wird direkt der MI-Befehl verwendet, bei ILE scheint eine MATH-Bibliothek verwendet zu werden.
    Jeder Compiler löst das nun auf seine Weise.
    Reines MI geht für solche Aktionen natürlich immer, zumal ein CALLX (Externer Call) fast so schnell wie ein GOTO ist.
    Bedenke aber, nicht jeder kann MI und es gibt nur einen OPM-MI-Compiler.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. ILE aus /36 aufrufen
    By Norbertf in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 14-10-14, 20:32
  2. System Performance Analyse und Performance Tuning
    By Bernstein in forum NEWSboard Server Job
    Antworten: 0
    Letzter Beitrag: 05-08-14, 17:34
  3. Client Access aufrufen und ein Pgm mittgeben
    By Robi in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 08-04-03, 07:40
  4. Batch-Programm aus RPG aufrufen?
    By hansr in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 28-11-02, 16:38
  5. Performance
    By mk in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 27-06-02, 09:32

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •