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