0

我想在 CL 中调用一个程序 100 次,以测量不同程序设置的调用时间。

也许是这样的?

DOFOR      VAR(&INT) FROM(0) TO(99)
CALL       PGM(TProg) PARM(&Parm)
ENDDO    
4

2 回答 2

2

当我进行这种测试时,我将迭代次数作为参数传入。

您应该有足够的迭代,以便使用最快设置的调用至少需要半分钟,以帮助取消诸如获取时间戳之类的额外工作。将迭代次数作为参数可以更轻松地执行此操作。

要在 CL 中获取时间戳,可以使用 RTVSYSVAL QDATETIME。

dcl &before type(*char) len(20)      
dcl &after type(*char) len(20)       

rtvsysval QDATETIME rtnvar(&before)  
--- do the loop
rtvsysval QDATETIME rtnvar(&after)   
sndpgmmsg &before
sndpgmmsg &after 

时间戳不太可读(20180203143253529956 表示 2018-02-03-14.32.53.529956)。您可能想要进行一些子串化以使它们更具可读性,或者甚至进行一些计算以获得两个时间戳之间的秒数。

更新以回答有关如何子串的问题:

我,我只想写一个 RPG 程序来获取两个时间戳之间的差异。

**free
dcl-pi *n;
   t1 char(20) const;
   t2 char(20) const;
   diffSeconds packed(7:2);
end-pi;
dcl-s ts1 timestamp;
dcl-s ts2 timestamp;
ts1 = %timestamp(t1 : *iso0);
ts2 = %timestamp(t2 : *iso0);
diffSeconds = %diff (ts1 : ts2 : *seconds : 2);
return;

如果您不想使用 RPG,或者您不能,那么您可以在 CL 中使用子字符串和串联来生成更具可读性的时间戳。

dcl &prtBefore type(*char) len(26)                      

chgvar &prtBefore (%sst(&before  1 4) *tcat '-' *tcat + 
                   %sst(&before  5 2) *tcat '-' *tcat + 
                   %sst(&before  7 2) *tcat '-' *tcat + 
                   %sst(&before  9 2) *tcat '.' *tcat + 
                   %sst(&before 11 2) *tcat '.' *tcat + 
                   %sst(&before 13 2) *tcat '.' *tcat + 
                   %sst(&before 15 6))                  
sndpgmmsg &prtBefore   
于 2018-02-03T14:37:47.873 回答
1

当然,这会奏效。你将如何衡量绩效?

于 2018-02-02T13:28:19.620 回答