Como obter o tempo de execução do Bash em milissegundos no Mac OS X?

12

Eu verifiquei isso , mas a solução fornecida não funcionou para mim.

Usando date, posso obter o tempo de execução em segundos:

T="$(date +%s)"
#some work here
T="$(($(date +%s)-T))"
echo "execution time (secs) ${T}"

No entanto, quando eu tento isso:

T="$(date +%s%N)"
#some work here
T="$(($(date +%s%N)-T))"

Adicionando% N (como acima) à data para obter a precisão de nanossegundos, recebo o seguinte erro: -bash: 1369320760N: valor muito alto para a base (o token de erro é "1369320760N")

Alguém sabe como medir o tempo de execução em milissegundos usando o bash no Mac OS X?

pacodelumberg
fonte
Você realmente precisa de nano segunda resolução? Qual dessa abordagem você tem muita sobrecarga. Com # some work hereomitido, recebo tempos de 0,2 a 0,3 segundos - o que deve ser zero (ou pelo menos constante) para atingir seu objetivo. Considerando que /usr/bin/time usleep 50000fornece um tempo estável razoável de 0,05 +/- 0,01 seg. (Apenas testado em Linux, não sei se / usr / bin / tempo e / ou usleep é acessível em OSX.)
mpy
Você tem certeza de que a resolução do relógio interno oferece resolução PRECISA até o nível de nanossegundos?
Mdpc 23/05

Respostas:

14

Como o OSX é um sistema BSD-ish, sua biblioteca strftime não possui %N( http://www.freebsd.org/cgi/man.cgi?query=date )

O timecomando bash builtin fornece as informações necessárias?

time some work here
Glenn Jackman
fonte
2
obrigado por deixar claro, o tempo funciona perfeitamente e gera três resultados, mas preciso trabalhar especificamente com os horários inicial e final.
Pacodelumberg
11

Eu seguiria essa rota se precisasse de milissegundos e o BSD não suportasse a data +%s%N

perl -MTime::HiRes -e 'printf("%.0f\n",Time::HiRes::time()*1000)'
hpavc
fonte
obrigado!!! Essa é a solução ninguém estava relatando ao redor ...
Daniele B
3

echo $(($(date +%s%N)/1000000))

Isso converteria de nanossegundos para mili-segundos.

De @mpy, date +%s.%Nfunciona.

A saída é diferente entre o linux e o OS X:
linux: 1369322592.573787111
OS X:1369322610.N

recatado
fonte
Estou recebendo o seguinte erro: -bash: 1369321446N: valor muito grande para base (erro token é "1369321446N") isso não funciona em Mac OSX, eu estou recebendo:
pacodelumberg
Bem, isso é chato ... (testado na janela errada) vendo o mesmo erro: /
demure
1
Não há necessidade de dividir a saída, basta usar date +%s.%N(mas não posso verificar no OSX; está funcionando no Linux). Mas o problema é que basho $(( ))IMHO não consegue lidar com números de ponto flutuante.
Mpy
@py Que funciona no osx. O mesmo ocorre com os 10 primeiros caracteres, mas funciona de maneira diferente entre o Linux e o OS X.
recatada 23/05
Isso significa que não podemos obter as informações do nano segundo usando date?
22613 pacodelumberg
3

Se você instalar, coreutilspoderá usar o GNU Linux dateescrevendo gdate.

coreutils está disponível com Homebrew: brew install coreutils.

youyoup
fonte
1

Como a outra resposta mencionou, a data do OS X não suporta% N (nanossegundos).

Você poderia salvar os comandos no tempo como um script? Ou use um subshell ou grupo de comandos para eles:

time (sleep 0.1; echo a; sleep 0.1)
time { sleep 0.1; echo a; sleep 0.1; }

Ou some os tempos dos comandos individuais:

$ time=$(TIMEFORMAT=%R; (time sleep 0.1; echo a) 2>&1 > /dev/null)
$ time+=+$(TIMEFORMAT=%R; (time sleep 0.1) 2>&1)
$ bc <<< $time
.206

Ou use alguma linguagem de script:

$ ruby -e 'puts "%.3f" % Time.now'
1369329611.046
$ time ruby -e '""'
0.029
$ time ruby -e 'puts "%.3f" % Time.now'
1369329622.943
0.029

%.3fé um especificador de formato para um número de ponto flutuante com 3 pontos decimais. Time.now é um método de classe da classe Time.

Lri
fonte
Obrigado pela sua resposta, você poderia descrever o código ruby ​​acima?
Pacodelumberg
1
Em ruby -e 'puts "%.3f" % Time.now', rubychama o intérprete ruby, -eexecuta o script a seguir na linha de comando. putsé ruby printf(tipo de), Timeé um objeto ruby ​​e Time.nowé o segundo desde a época. Usando %.3fguarnições a saída 3 casas decimais, que é milissegundos (os ".046" e" 0,943" partes da saída.)
Olie
1
Além disso, timeé uma ferramenta de linha de comando que calcula quanto tempo leva para executar o comando a seguir. Veja man timepara mais detalhes.
Olie
1

Glenn está certo, timeé o comando que você está procurando, mas, para analisar as informações desejadas, será necessário repassá-las para algum outro processador, como sed.

time command-goes-here >/dev/null 2>$1|sed rules-go-here

Este comando se livra da saída do próprio comando (enviando as saídas padrão e de erro para / dev / null) e passa os resultados de tempo para sed, onde você precisará escolher as regras apropriadas para editar o fluxo e a saída o valor desejado.

Zach Melnick
fonte