Как я могу вызвать программу 100 раз в CL?

Я хочу вызывать программу в CL 100 раз, чтобы измерить время вызовов при разных настройках программы.

Может как то так?

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

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   

Конечно, это будет работать. Как вы собираетесь измерять производительность?

Другие вопросы по тегам