Augmentez la précision de% e avec la commande / usr / bin / time shell

19

Lorsque j'exécute la commande time dans le shell, time ./myappj'obtiens une sortie comme celle-ci:

real    0m0.668s
user    0m0.112s
sys     0m0.028s

Cependant, lorsque j'exécute la commande, \time -f %e ./myappje perds en précision et j'obtiens:

2.01s

Si j'utilise la %Ecommande, je perds également en précision de la même manière. Comment puis-je le changer pour avoir à nouveau plus de précision, mais que seules les secondes soient sorties?

J'ai basé mes recherches dans cette commande Linux / Unix: le temps et sur cette question

Flame_Phoenix
la source

Réponses:

21

Je suppose que vous comprenez que ces deux commandes appellent une version différente de l'heure, non?

version intégrée de bash

% time

Temps GNU aka. / usr / bin / time

% \time

La timecommande intégrée à bashpeut être lue ici:

% help time
time: time [-p] PIPELINE
    Execute PIPELINE and print a summary of the real time, user CPU time,
    and system CPU time spent executing PIPELINE when it terminates.
    The return status is the return status of PIPELINE.  The `-p' option
    prints the timing summary in a slightly different format.  This uses
    the value of the TIMEFORMAT variable as the output format.

La GNU time, /usr/bin/timeest généralement plus utile que le intégré.

Quant à votre problème de précision, il est abordé ici dans ce gistub gistub , en particulier:

Pourquoi le temps bash est-il plus précis que le temps GNU?

Le temps de commande bash intégré donne une précision d'exécution en millisecondes, et le temps GNU (généralement / usr / bin / time) donne une précision en centisecondes. Le syscall times (2) donne des temps en horloges, et 100 horloges = 1 seconde (généralement), donc la précision est comme l'heure GNU. Quel temps bash utilise-t-il pour qu'il soit plus précis?

Bash time utilise en interne getrusage () et GNU time utilise times (). getrusage () est beaucoup plus précis en raison de la résolution en microsecondes.

Vous pouvez voir les centisecondes avec l'exemple suivant ( voir 5ème ligne de sortie ):

% /usr/bin/time -v sleep .22222
    Command being timed: "sleep .22222"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.22
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 1968
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 153
    Voluntary context switches: 2
    Involuntary context switches: 1
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

Plus de résolution peut être obtenue en utilisant la timecommande de bash comme ceci et vous pouvez contrôler la résolution:

# 3 places 
% TIMEFORMAT='%3R'; time ( sleep .22222 )
0.224

Du manuel Bash sur les variables :

TIMEFORMAT
The value of this parameter is used as a format string specifying how the timing information for pipelines prefixed with the time reserved word should be displayed. The ‘%’ character introduces an escape sequence that is expanded to a time value or other information. The escape sequences and their meanings are as follows; the braces denote optional portions.

%%
A literal ‘%’.

%[p][l]R
The elapsed time in seconds.

%[p][l]U
The number of CPU seconds spent in user mode.

%[p][l]S
The number of CPU seconds spent in system mode.

%P
The CPU percentage, computed as (%U + %S) / %R.

The optional p is a digit specifying the precision, the number of fractional digits after a decimal point. A value of 0 causes no decimal point or fraction to be output. At most three places after the decimal point may be specified; values of p greater than 3 are changed to 3. If p is not specified, the value 3 is used.

The optional l specifies a longer format, including minutes, of the form MMmSS.FFs. The value of p determines whether or not the fraction is included.

If this variable is not set, Bash acts as if it had the value

$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'
If the value is null, no timing information is displayed. A trailing newline is added when the format string is displayed.
slm
la source
oui je savais déjà tout ça. Je peux donc conclure que ce que je veux est impossible? Existe-t-il un moyen d'utiliser la version de l'heure bash et d'obtenir uniquement le temps réel en secondes avec 3 chiffres?
Flame_Phoenix
Voir ma mise à jour, vous pouvez contrôler la commande time de bash en utilisant la variable TIMEFORMAT. C'est ça que vous cherchez?
slm
Yah, c'est ça, merci! Je me demande cependant comment ajouter cela à un fichier? J'essaie d'utiliser% TIMEFORMAT = '% 3R'; time (sleep .22222) >> bla.txt mais cela ne fonctionne pas: S Quoi qu'il en soit, sélectionné. J'aimerais pouvoir te donner du karma ++, mais je n'ai pas 15 karma -.- '
Flame_Phoenix
2
TIMEFORMAT = '% 3R'; time (sleep .22222) 2 >> myFile.txt GOt it!
Flame_Phoenix
Utilisateur de longue date des deux et ne connaissant pas TIMEFORMAT, j'ai toujours utilisé sed pour extraire en temps réel. Merci! Le «en raison de la résolution en microsecondes». déclaration a mis mes espoirs qui TIMEFORMAT=%6Rfonctionneraient, mais il semble que le chiffre de précision ne peut être que 0-3.
mxmlnkn