Aqui está uma solução que:
eliminate[s] the time taken for each shell to load and initialize itself
can be run from within each shell
- Usos
no shell built-in time
commands, since none are portable or general
- Funciona em todos os shells compatíveis com POSIX.
- Funciona em todos os sistemas compatíveis com POSIX e XSI com um compilador C , ou onde você pode compilar um executável C antecipadamente.
- Usa a mesma implementação de tempo em todos os shells.
Existem duas partes: um pequeno programa em C que encerra gettimeofday
, que é obsoleto, mas ainda mais portátil que clock_gettime
e um script de shell curto que usa esse programa para obter um relógio com precisão de microssegundo lendo ambos os lados da origem de um script. O programa C é a única maneira portátil e mínima de sobrecarga para obter uma precisão de menos de um segundo em um timestamp.
Aqui está o programa C epoch.c
:
#include <sys/time.h>
#include <stdio.h>
int main(int argc, char **argv) {
struct timeval time;
gettimeofday(&time, NULL);
printf("%li.%06i", time.tv_sec, time.tv_usec);
}
E o script de shell timer
:
#!/bin/echo Run this in the shell you want to test
START=$(./epoch)
. "$1"
END=$(./epoch)
echo "$END - $START" | bc
Esta é a linguagem de comandos shell padrão e .opengroup.org / onlinepubs / 9699919799 / utilities / bc.html "> bc
e deve funcionar como um script em qualquer shell compatível com POSIX.
Você pode usar isso como:
$ bash timer ./test.sh
.002052
$ dash timer ./test.sh
.000895
$ zsh timer ./test.sh
.000662
Não mede o tempo do sistema ou do usuário, apenas o tempo decorrido não monotônico do relógio de parede. Se o relógio do sistema mudar durante a execução do script, isso fornecerá resultados incorretos. Se o sistema estiver sob carga, o resultado não será confiável. Eu não acho que nada melhor possa ser portátil entre os shells.
Um script de timer modificado pode usar eval
para executar comandos fora do um script.