Difference between revisions of "Parameter passing benchmark test"

From MidrangeWiki
Jump to: navigation, search
Line 1: Line 1:
Below is the code for a test program designed benchmark the passing of large character data to a subprocedure. To call this program simply call it from a command line with a single numeric parameter. This parameter will instruct the program to perform that number of calls for each test. The results displayed will be an average call time for each test.
+
Below is the code for a test program designed benchmark the passing of large character data to a subprocedure. To call this program simply call it from a command line. The program will perform each check and print out the average call times per 100 calls for each check. There are 2 optional parameters. the first parameter will instruct the program to perform that number of calls for each test. The second parameter will instruct the program to print the time taken to perform that number of calls. The default for the parameters is 10,000 and 100. that is, the program will call each subprocedure 10,000 times and give the average time per 100 calls.
  
 
The results will be displayed on the terminal.
 
The results will be displayed on the terminal.
 
It may be necessary to amend the code to measure the call time more accurately, or to provide an aggregate call time. this is because on extremely fast machines the values returned may be less than 1 ms per call.
 
  
 
== The code ==
 
== The code ==
Line 10: Line 8:
  
 
     d valueconst      pr                  extpgm('VALUECONST')
 
     d valueconst      pr                  extpgm('VALUECONST')
     d ntimes                        15p 5 const
+
     d p_ntimes                      15p 5 const
 +
    d p_percall                    15p 5 const
 
     d valueconst      pi
 
     d valueconst      pi
     d ntimes                        15p 5 const
+
     d p_ntimes                      15p 5 const
 +
    d p_percall                    15p 5 const
  
 
     d byvalue        pr
 
     d byvalue        pr
Line 28: Line 28:
  
 
     d getchar        pr            10i 0 extproc('getchar')
 
     d getchar        pr            10i 0 extproc('getchar')
 +
 +
    d ntimes          s            10i 0 inz(10000)
 +
    d percall        s            10i 0 inz(100)
 +
    d group          s            10i 0 inz(0)
  
 
     d startTime      s              z
 
     d startTime      s              z
Line 42: Line 46:
 
     d charField      s          65535a
 
     d charField      s          65535a
 
       /free
 
       /free
 +
 +
          // Override number of calls to make to each function...
 +
          if %parms >= 1;
 +
            ntimes = p_ntimes;
 +
          endif;
 +
 +
          // Override number of calls to group over...
 +
          if %parms >= 2;
 +
            percall = p_percall;
 +
          endif;
 +
 +
          group = ntimes/percall;
  
 
           printf('----------------------------------------------' + crlf);
 
           printf('----------------------------------------------' + crlf);
 
           printf('Starting test...' + crlf);
 
           printf('Starting test...' + crlf);
 +
          printf('' + crlf);
 +
          printf('Testing with total ' + %char(ntimes) + ' calls' + crlf);
 +
          printf('Times given per ' + %char(percall) + ' calls' + crlf);
 +
          printf('' + crlf);
  
 
           // For VARYING...
 
           // For VARYING...
Line 52: Line 72:
 
           endfor;
 
           endfor;
 
           endTime = %timestamp();
 
           endTime = %timestamp();
           t1 = (%diff(endTime : startTime : *ms)/ntimes);
+
           t1 = (%diff(endTime : startTime : *ms)/group);
  
 
           startTime = %timestamp();
 
           startTime = %timestamp();
Line 59: Line 79:
 
           endfor;
 
           endfor;
 
           endTime = %timestamp();
 
           endTime = %timestamp();
           t2 = (%diff(endTime : startTime : *ms)/ntimes);
+
           t2 = (%diff(endTime : startTime : *ms)/group);
  
 
           printf('Passing the literal _a_ for 65535a varying...' + crlf);
 
           printf('Passing the literal _a_ for 65535a varying...' + crlf);
Line 71: Line 91:
 
           endfor;
 
           endfor;
 
           endTime = %timestamp();
 
           endTime = %timestamp();
           t1 = (%diff(endTime : startTime : *ms)/ntimes);
+
           t1 = (%diff(endTime : startTime : *ms)/group);
  
 
           startTime = %timestamp();
 
           startTime = %timestamp();
Line 78: Line 98:
 
           endfor;
 
           endfor;
 
           endTime = %timestamp();
 
           endTime = %timestamp();
           t2 = (%diff(endTime : startTime : *ms)/ntimes);
+
           t2 = (%diff(endTime : startTime : *ms)/group);
  
 
           printf('Passing a 65535a varying with 100a filled...' + crlf);
 
           printf('Passing a 65535a varying with 100a filled...' + crlf);
Line 90: Line 110:
 
           endfor;
 
           endfor;
 
           endTime = %timestamp();
 
           endTime = %timestamp();
           t1 = (%diff(endTime : startTime : *ms)/ntimes);
+
           t1 = (%diff(endTime : startTime : *ms)/group);
  
 
           startTime = %timestamp();
 
           startTime = %timestamp();
Line 97: Line 117:
 
           endfor;
 
           endfor;
 
           endTime = %timestamp();
 
           endTime = %timestamp();
           t2 = (%diff(endTime : startTime : *ms)/ntimes);
+
           t2 = (%diff(endTime : startTime : *ms)/group);
  
 
           printf('Passing a 65535a varying with 1000a filled...' + crlf);
 
           printf('Passing a 65535a varying with 1000a filled...' + crlf);
Line 109: Line 129:
 
           endfor;
 
           endfor;
 
           endTime = %timestamp();
 
           endTime = %timestamp();
           t1 = (%diff(endTime : startTime : *ms)/ntimes);
+
           t1 = (%diff(endTime : startTime : *ms)/group);
  
 
           startTime = %timestamp();
 
           startTime = %timestamp();
Line 116: Line 136:
 
           endfor;
 
           endfor;
 
           endTime = %timestamp();
 
           endTime = %timestamp();
           t2 = (%diff(endTime : startTime : *ms)/ntimes);
+
           t2 = (%diff(endTime : startTime : *ms)/group);
  
 
           printf('Passing a 65535a varying with 65535a filled...' + crlf);
 
           printf('Passing a 65535a varying with 65535a filled...' + crlf);
Line 129: Line 149:
 
           endfor;
 
           endfor;
 
           endTime = %timestamp();
 
           endTime = %timestamp();
           t1 = (%diff(endTime : startTime : *ms)/ntimes);
+
           t1 = (%diff(endTime : startTime : *ms)/group);
  
 
           startTime = %timestamp();
 
           startTime = %timestamp();
Line 136: Line 156:
 
           endfor;
 
           endfor;
 
           endTime = %timestamp();
 
           endTime = %timestamp();
           t2 = (%diff(endTime : startTime : *ms)/ntimes);
+
           t2 = (%diff(endTime : startTime : *ms)/group);
  
 
           printf('Passing the literal _a_ for 65535a...' + crlf);
 
           printf('Passing the literal _a_ for 65535a...' + crlf);
Line 148: Line 168:
 
           endfor;
 
           endfor;
 
           endTime = %timestamp();
 
           endTime = %timestamp();
           t1 = (%diff(endTime : startTime : *ms)/ntimes);
+
           t1 = (%diff(endTime : startTime : *ms)/group);
  
 
           startTime = %timestamp();
 
           startTime = %timestamp();
Line 155: Line 175:
 
           endfor;
 
           endfor;
 
           endTime = %timestamp();
 
           endTime = %timestamp();
           t2 = (%diff(endTime : startTime : *ms)/ntimes);
+
           t2 = (%diff(endTime : startTime : *ms)/group);
  
 
           printf('Passing a 65535a with 100a filled...' + crlf);
 
           printf('Passing a 65535a with 100a filled...' + crlf);
Line 167: Line 187:
 
           endfor;
 
           endfor;
 
           endTime = %timestamp();
 
           endTime = %timestamp();
           t1 = (%diff(endTime : startTime : *ms)/ntimes);
+
           t1 = (%diff(endTime : startTime : *ms)/group);
  
 
           startTime = %timestamp();
 
           startTime = %timestamp();
Line 174: Line 194:
 
           endfor;
 
           endfor;
 
           endTime = %timestamp();
 
           endTime = %timestamp();
           t2 = (%diff(endTime : startTime : *ms)/ntimes);
+
           t2 = (%diff(endTime : startTime : *ms)/group);
  
 
           printf('Passing a 65535a with 1000a filled...' + crlf);
 
           printf('Passing a 65535a with 1000a filled...' + crlf);
Line 186: Line 206:
 
           endfor;
 
           endfor;
 
           endTime = %timestamp();
 
           endTime = %timestamp();
           t1 = (%diff(endTime : startTime : *ms)/ntimes);
+
           t1 = (%diff(endTime : startTime : *ms)/group);
  
 
           startTime = %timestamp();
 
           startTime = %timestamp();
Line 193: Line 213:
 
           endfor;
 
           endfor;
 
           endTime = %timestamp();
 
           endTime = %timestamp();
           t2 = (%diff(endTime : startTime : *ms)/ntimes);
+
           t2 = (%diff(endTime : startTime : *ms)/group);
  
 
           printf('Passing a 65535a with 65535a filled...' + crlf);
 
           printf('Passing a 65535a with 65535a filled...' + crlf);
Line 235: Line 255:
  
 
The results so far are:
 
The results so far are:
 +
 +
(If you wish to include the timings for your machine it is recommended that you call the program with no parameters. This will ensure all benchmark tests will be easily compared (10,000 calls per subprocedure, and time per 100 calls printed)
  
 
<pre>
 
<pre>

Revision as of 06:12, 6 November 2007

Below is the code for a test program designed benchmark the passing of large character data to a subprocedure. To call this program simply call it from a command line. The program will perform each check and print out the average call times per 100 calls for each check. There are 2 optional parameters. the first parameter will instruct the program to perform that number of calls for each test. The second parameter will instruct the program to print the time taken to perform that number of calls. The default for the parameters is 10,000 and 100. that is, the program will call each subprocedure 10,000 times and give the average time per 100 calls.

The results will be displayed on the terminal.

The code

     H dftactgrp(*no) bnddir('QC2LE')

     d valueconst      pr                  extpgm('VALUECONST')
     d p_ntimes                      15p 5 const
     d p_percall                     15p 5 const
     d valueconst      pi
     d p_ntimes                      15p 5 const
     d p_percall                     15p 5 const

     d byvalue         pr
     d bigparm                    65535a   varying value
     d byconst         pr
     d bigparm                    65535a   varying const

     d byvalueC        pr
     d bigparm                    65535a   value
     d byconstC        pr
     d bigparm                    65535a   const

     d printf          pr                  extproc('printf')
     d                                 *   value options(*string)

     d getchar         pr            10i 0 extproc('getchar')

     d ntimes          s             10i 0 inz(10000)
     d percall         s             10i 0 inz(100)
     d group           s             10i 0 inz(0)

     d startTime       s               z
     d endTime         s               z
     d t1              s             10i 0
     d t2              s             10i 0
     d msg             s             52a
     d i               s             10i 0
     d crlf            c                   const(X'0d25')
     d char100         s            100a   varying inz(*all'X')
     d char1000        s           1000a   varying inz(*all'X')
     d char65535       s          65535a   varying inz(*all'X')
     d varyingField    s          65535a   varying
     d charField       s          65535a
      /free

           // Override number of calls to make to each function...
           if %parms >= 1;
             ntimes = p_ntimes;
           endif;

           // Override number of calls to group over...
           if %parms >= 2;
             percall = p_percall;
           endif;

           group = ntimes/percall;

           printf('----------------------------------------------' + crlf);
           printf('Starting test...' + crlf);
           printf('' + crlf);
           printf('Testing with total ' + %char(ntimes) + ' calls' + crlf);
           printf('Times given per ' + %char(percall) + ' calls' + crlf);
           printf('' + crlf);

           // For VARYING...
           startTime = %timestamp();
           for i = 1 to %int(ntimes);
             byvalue ('a');
           endfor;
           endTime = %timestamp();
           t1 = (%diff(endTime : startTime : *ms)/group);

           startTime = %timestamp();
           for i = 1 to %int(ntimes);
             byconst ('a');
           endfor;
           endTime = %timestamp();
           t2 = (%diff(endTime : startTime : *ms)/group);

           printf('Passing the literal _a_ for 65535a varying...' + crlf);
           printf('value: ' + %editc(t1 : 'P') + ' ms | '
           + 'const: ' + %editc(t2 : 'P') + ' ms' + crlf);

           varyingField = char100;
           startTime = %timestamp();
           for i = 1 to %int(ntimes);
             byvalue (varyingField);
           endfor;
           endTime = %timestamp();
           t1 = (%diff(endTime : startTime : *ms)/group);

           startTime = %timestamp();
           for i = 1 to %int(ntimes);
             byconst (varyingField);
           endfor;
           endTime = %timestamp();
           t2 = (%diff(endTime : startTime : *ms)/group);

           printf('Passing a 65535a varying with 100a filled...' + crlf);
           printf('value: ' + %editc(t1 : 'P') + ' ms | '
           + 'const: ' + %editc(t2 : 'P') + ' ms' + crlf);

           varyingField = char1000;
           startTime = %timestamp();
           for i = 1 to %int(ntimes);
             byvalue (varyingField);
           endfor;
           endTime = %timestamp();
           t1 = (%diff(endTime : startTime : *ms)/group);

           startTime = %timestamp();
           for i = 1 to %int(ntimes);
             byconst (varyingField);
           endfor;
           endTime = %timestamp();
           t2 = (%diff(endTime : startTime : *ms)/group);

           printf('Passing a 65535a varying with 1000a filled...' + crlf);
           printf('value: ' + %editc(t1 : 'P') + ' ms | '
           + 'const: ' + %editc(t2 : 'P') + ' ms' + crlf);

           varyingField = char65535;
           startTime = %timestamp();
           for i = 1 to %int(ntimes);
             byvalue (varyingField);
           endfor;
           endTime = %timestamp();
           t1 = (%diff(endTime : startTime : *ms)/group);

           startTime = %timestamp();
           for i = 1 to %int(ntimes);
             byconst (varyingField);
           endfor;
           endTime = %timestamp();
           t2 = (%diff(endTime : startTime : *ms)/group);

           printf('Passing a 65535a varying with 65535a filled...' + crlf);
           printf('value: ' + %editc(t1 : 'P') + ' ms | '
           + 'const: ' + %editc(t2 : 'P') + ' ms' + crlf);


           // For CHAR...
           startTime = %timestamp();
           for i = 1 to %int(ntimes);
             byvalueC ('a');
           endfor;
           endTime = %timestamp();
           t1 = (%diff(endTime : startTime : *ms)/group);

           startTime = %timestamp();
           for i = 1 to %int(ntimes);
             byconstC ('a');
           endfor;
           endTime = %timestamp();
           t2 = (%diff(endTime : startTime : *ms)/group);

           printf('Passing the literal _a_ for 65535a...' + crlf);
           printf('value: ' + %editc(t1 : 'P') + ' ms | '
           + 'const: ' + %editc(t2 : 'P') + ' ms' + crlf);

           charField = char100;
           startTime = %timestamp();
           for i = 1 to %int(ntimes);
             byvalueC (charField);
           endfor;
           endTime = %timestamp();
           t1 = (%diff(endTime : startTime : *ms)/group);

           startTime = %timestamp();
           for i = 1 to %int(ntimes);
             byconstC (charField);
           endfor;
           endTime = %timestamp();
           t2 = (%diff(endTime : startTime : *ms)/group);

           printf('Passing a 65535a with 100a filled...' + crlf);
           printf('value: ' + %editc(t1 : 'P') + ' ms | '
           + 'const: ' + %editc(t2 : 'P') + ' ms' + crlf);

           charField = char1000;
           startTime = %timestamp();
           for i = 1 to %int(ntimes);
             byvalueC (charField);
           endfor;
           endTime = %timestamp();
           t1 = (%diff(endTime : startTime : *ms)/group);

           startTime = %timestamp();
           for i = 1 to %int(ntimes);
             byconstC (charField);
           endfor;
           endTime = %timestamp();
           t2 = (%diff(endTime : startTime : *ms)/group);

           printf('Passing a 65535a with 1000a filled...' + crlf);
           printf('value: ' + %editc(t1 : 'P') + ' ms | '
           + 'const: ' + %editc(t2 : 'P') + ' ms' + crlf);

           charField = char65535;
           startTime = %timestamp();
           for i = 1 to %int(ntimes);
             byvalueC (charField);
           endfor;
           endTime = %timestamp();
           t1 = (%diff(endTime : startTime : *ms)/group);

           startTime = %timestamp();
           for i = 1 to %int(ntimes);
             byconstC (charField);
           endfor;
           endTime = %timestamp();
           t2 = (%diff(endTime : startTime : *ms)/group);

           printf('Passing a 65535a with 65535a filled...' + crlf);
           printf('value: ' + %editc(t1 : 'P') + ' ms | '
           + 'const: ' + %editc(t2 : 'P') + ' ms' + crlf);

           printf('Test ended - press ENTER to close window...' + crlf);
           printf('----------------------------------------------' + crlf);


           // Read 1 char from the keyboard - to force display of screen...
           i = getchar();

           *inlr = *on;
       /end-free

     P byvalue         b
     D byValue         pi
     D bigParm                    65535a   varying value
     P byValue         e

     P byConst         b
     D byConst         pi
     D bigParm                    65535a   varying const
     P byConst         e

     P byvalueC        b
     D byValueC        pi
     D bigParm                    65535a   value
     P byValueC        e

     P byConstC        b
     D byConstC        pi
     D bigParm                    65535a   const
     P byConstC        e

RESULTS

The results so far are:

(If you wish to include the timings for your machine it is recommended that you call the program with no parameters. This will ensure all benchmark tests will be easily compared (10,000 calls per subprocedure, and time per 100 calls printed)

Version V5R2
Model 270
Times per 1 call

Passing the literal _a_ for 65535a varying...
value:        1510 ms | const:           9 ms
Passing a 65535a varying with 100a filled... 
value:        1456 ms | const:           8 ms
Passing a 65535a varying with 1000a filled...
value:        1502 ms | const:           8 ms
Passing a 65535a varying with 65535a filled..
value:        2219 ms | const:           8 ms
Passing the literal _a_ for 65535a...        
value:        1904 ms | const:         338 ms
Passing a 65535a with 100a filled...         
value:         974 ms | const:           8 ms
Passing a 65535a with 1000a filled...        
value:         973 ms | const:           8 ms
Passing a 65535a with 65535a filled...       
value:        1265 ms | const:           8 ms


Version V5R4
Model   520
Times per 1 call

Passing the literal _a_ for 65535a varying...
value:         133 ms | const:           6 ms
Passing a 65535a varying with 100a filled... 
value:         150 ms | const:           1 ms
Passing a 65535a varying with 1000a filled...
value:         131 ms | const:           6 ms
Passing a 65535a varying with 65535a filled..
value:         201 ms | const:           1 ms
Passing the literal _a_ for 65535a...        
value:         207 ms | const:          41 ms
Passing a 65535a with 100a filled...         
value:         127 ms | const:           1 ms
Passing a 65535a with 1000a filled...        
value:         122 ms | const:           7 ms
Passing a 65535a with 65535a filled...       
value:         120 ms | const:           1 ms

Version V5R3
Model   890
Times per 1 call

Passing the literal _a_ for 65535a varying...        
value:         120 ms | const:           0 ms        
Passing a 65535a varying with 100a filled...         
value:          60 ms | const:           0 ms        
Passing a 65535a varying with 1000a filled...        
value:          50 ms | const:           0 ms        
Passing a 65535a varying with 65535a filled...       
value:          90 ms | const:           0 ms        
Passing the literal _a_ for 65535a...                
value:         180 ms | const:          30 ms        
Passing a 65535a with 100a filled...                 
value:          60 ms | const:           0 ms        
Passing a 65535a with 1000a filled...                
value:          60 ms | const:           0 ms  
Passing a 65535a with 65535a filled...         
value:          60 ms | const:           0 ms


Version V5R2
Model   170 (2290)
Times per 1 call

Passing the literal _a_ for 65535a varying...
value:        3339 ms | const:          24 ms
Passing a 65535a varying with 100a filled... 
value:        3314 ms | const:          21 ms
Passing a 65535a varying with 1000a filled...
value:        3367 ms | const:          21 ms
Passing a 65535a varying with 65535a filled...
value:        4572 ms | const:          21 ms
Passing the literal _a_ for 65535a...        
value:        4579 ms | const:        1087 ms
Passing a 65535a with 100a filled...         
value:        2483 ms | const:          21 ms
Passing a 65535a with 1000a filled...        
value:        2844 ms | const:          23 ms
Passing a 65535a with 65535a filled...       
value:        2503 ms | const:          22 ms


Version V5R2
Model   SB1 (2313)
Times per 1 call

Passing the literal _a_ for 65535a varying...
value:         318 ms | const:           2 ms
Passing a 65535a varying with 100a filled... 
value:         301 ms | const:           1 ms
Passing a 65535a varying with 1000a filled...
value:         339 ms | const:           1 ms
Passing a 65535a varying with 65535a filled...
value:         439 ms | const:           1 ms
Passing the literal _a_ for 65535a...        
value:         570 ms | const:          95 ms
Passing a 65535a with 100a filled...         
value:         246 ms | const:           1 ms
Passing a 65535a with 1000a filled...        
value:         276 ms | const:           1 ms
Passing a 65535a with 65535a filled...       
value:         246 ms | const:           1 ms