%MSECONDS
Durée en microsecondes
Représente un nombre de microsecondes, à ajouter à un horodatage ou à en retrancher ; malgré son nom, l'unité n'est pas la milliseconde.
Syntaxe
horodatage + %MSECONDS(nombre)
horodatage - %MSECONDS(nombre)
nombre- Le nombre de microsecondes (millionièmes de seconde). Une constante, une zone numérique ou une expression.
- Résultat
- Une durée, utilisable uniquement avec un horodatage. Une date (RNF7584) et une heure (RNF7585) la refusent à la compilation.
À quoi ça sert
Pour mesurer un temps de réponse, dater très finement des événements ou régler une horloge de test, il faut descendre sous la seconde. L'horodatage stocke les microsecondes, et %MSECONDS est la seule durée qui agit à ce niveau.
Exemple 1 : Un million de microsecondes
**free
// %MSECONDS : la duree est en MICROSECONDES (pas en millisecondes).
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s trace timestamp inz(z'2026-09-30-14.05.30.000000');
snd-msg 'Origine : [' + %char(trace) + ']';
snd-msg '+ %MSECONDS(1) : [' + %char(trace + %mseconds(1)) + ']';
snd-msg '+ %MSECONDS(1000) : [' + %char(trace + %mseconds(1000)) + ']';
snd-msg '+ %MSECONDS(500000): [' + %char(trace + %mseconds(500000)) + ']';
snd-msg '+ 1 000 000 : [' + %char(trace + %mseconds(1000000)) + ']';
// Pour ajouter 250 ms (millisecondes), il faut multiplier par 1 000.
snd-msg '+ 250 ms : [' + %char(trace + %mseconds(250 * 1000)) + ']';
// Retrancher fonctionne aussi, et traverse la seconde.
snd-msg '- 1 microseconde : [' + %char(trace - %mseconds(1)) + ']';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Origine : [2026-09-30-14.05.30.000000]
+ %MSECONDS(1) : [2026-09-30-14.05.30.000001]
+ %MSECONDS(1000) : [2026-09-30-14.05.30.001000]
+ %MSECONDS(500000): [2026-09-30-14.05.30.500000]
+ 1 000 000 : [2026-09-30-14.05.31.000000]
+ 250 ms : [2026-09-30-14.05.30.250000]
- 1 microseconde : [2026-09-30-14.05.29.999999]
1 microseconde change le dernier chiffre, 1 000 en font une milliseconde, 500 000 une demi-seconde, 1 000 000 une seconde entière. Pour ajouter 250 millisecondes, on écrit 250 * 1000. Retrancher une microseconde traverse la seconde : 14.05.29.999999.
Exemple 2 : Temps de réponse en millisecondes
**free
// %MSECONDS et %DIFF(*MSECONDS) : mesurer un temps de reponse en millisecondes.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s appel timestamp inz(z'2026-09-30-14.05.30.100000');
dcl-s reponse timestamp;
dcl-s micro int(20);
dcl-s milli int(20);
// Simulation : la reponse arrive 348 ms apres l'appel.
reponse = appel + %mseconds(348 * 1000);
// %DIFF avec *MSECONDS renvoie des microsecondes.
micro = %diff(reponse : appel : *mseconds);
snd-msg 'Ecart brut : ' + %char(micro) + ' microsecondes';
// Conversion en millisecondes : on divise par 1 000.
milli = %div(micro : 1000);
snd-msg 'En millisecondes : ' + %char(milli) + ' ms';
// Alerte au-dela de 300 ms.
if milli > 300;
snd-msg 'Temps de reponse trop long';
endif;
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Ecart brut : 348000 microsecondes
En millisecondes : 348 ms
Temps de reponse trop long
La réponse arrive 348 ms après l'appel. %DIFF avec *MSECONDS donne 348 000 (microsecondes) ; on divise par 1000 avec %DIV pour obtenir des millisecondes. Les zones sont en int(20) pour éviter le débordement sur de longs intervalles.
Le piège
%MSECONDS compte en microsecondes, pas en millisecondes. %MSECONDS(500) ajoute 0,0005 seconde, pas une demi-seconde. Pour une durée en millisecondes, multiplier par 1000. Même règle pour %DIFF(... : *MSECONDS), dont le résultat dépasse vite un int(10) (deux jours font déjà 172,8 milliards de microsecondes).
Enfin, cette durée n'existe pas pour les zones de type heure, qui s'arrêtent à la seconde (RNF7585).