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

11

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

Usando a data, 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 tento isso:

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

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

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

    
por pacodelumberg 23.05.2013 / 16:54

6 respostas

13

Como o OSX é um sistema BSD-ish, a biblioteca strftime não possui %N ( link )

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

time some work here
    
por 23.05.2013 / 17:14
7

Eu seguiria esse caminho se eu precisasse de milissegundos e o BSD não suportasse data +%s%N

perl -MTime::HiRes -e 'printf("%.0f\n",Time::HiRes::time()*1000)'
    
por 06.02.2014 / 05:22
2

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

Isso converteria de nano segundos para milissegundos.

De @mpy, date +%s.%N funciona.

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

    
por 23.05.2013 / 17:03
1

Como a outra resposta mencionada, 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 comando para eles:

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

Ou some os tempos de 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.

    
por 23.05.2013 / 19:22
1

Glenn está certo, time é o comando que você está procurando, mas para analisar a informação que você quer, você precisará passá-lo para algum outro processador como sed .

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

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

    
por 01.06.2013 / 00:07
1

Se você instalar o coreutils , poderá usar o GNU Linux date escrevendo gdate .

O

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

    
por 19.05.2015 / 22:47

Tags