Como medir os comandos de tempo?

18

Estou time ing alguns dos meus comandos. Agora, para calcular a média das medidas, gostaria de executar e cronometrar meus comandos em um determinado número de vezes e obter os resultados com uma média calculada e um desvio padrão. O resultado seria como:

avgtime -n 100 my_command

real    0m5.388s stdev 0m0.068s
user    0m5.380s stdev 0m0.067s
sys     0m0.004s stdev 0m0.000s

Existe uma ferramenta UNIX para isso? O GNU / Linux tem um?

    
por Didier Trosset 23.01.2012 / 12:04

4 respostas

6

Você pode tentar usar o módulo timeit, disponível em qualquer sistema com Python:

$ python -m timeit "__import__('os').system('my command here')"
10 loops, best of 3: 591 msec per loop
    
por 10.04.2014 / 17:11
4

Não é exatamente uma ferramenta UNIX ou GNU / Linux, mas você pode usar confortavelmente o R para isso. (Eu não posso encontrar algo mais específico para sua tarefa, embora .)

Editar Como eu poderia duvidar, é claro que existe um pacote de referência para R : rbenchmark . Ele aparentemente envolve system.time() , que você também pode usar diretamente. Ou dê uma olhada nisso, um simples par de funções de cronômetro. Veja também " Executar um comando do sistema "@Rosetta Code (ou não, é system("command") .)

Edit2 Acabei de ver esta pergunta, "Medindo o tempo em um script" na coluna "Relacionada" correta, isso também pode ser usado, ou seja, reserve tempo, faça loop ( N times), reserve tempo novamente, calcule o intervalo de tempo, divida por N . (Ainda mais fácil, tente time ( for-loop ) , analise sua saída, divida por N ).

    
por 23.01.2012 / 13:17
2

Você pode usar R para calcular rapidamente a média, o desvio padrão e outros valores interessantes.

Por exemplo, você pode usar o tempo GNU para gravar várias medições de tempo de execução em um arquivo CSV:

function measure
{
  f=$1; shift
  n=$2; shift
  echo wall,user,sys,rss > "$f"
  for i in $(seq $n); do
    /usr/bin/time --output "$f" --append --format '%e,%U,%S,%M' "$@" >/dev/null
  done
}

Então você pode gerar os valores com R assim:

Rscript --vanilla -e "b=read.csv(file='$f');summary(b);sapply(b, sd);"

Eu criei um pequeno script de benchmark que também faz uma impressão bonita do R saída, por exemplo:

$ benchmark.sh 100 ./some_prog arg1 arg2
n=100 | min    | Q1     | med    | mean   | Q3     | max    | std
wall  | 0.0400 | 0.0400 | 0.0500 | 0.0471 | 0.0500 | 0.0800 | 0.00624
user  | 0.0400 | 0.0400 | 0.0400 | 0.0426 | 0.0400 | 0.0700 | 0.00562
sys   | 0      | 0      | 0      | 0      | 0      | 0      | 0.00000
rss   | 2608   | 2657   | 2704   | 2728   | 2764   | 2920   | 95.06524
    
por 01.10.2016 / 23:52
1

Opção 1 - sqlite :

crie uma tabela simples com colunas de comando e hora e visualize com os cálculos agregação adequados. Após o tempo, adicione uma linha à tabela.

Vantagens: mais simples de definir uma tabela em comparação com a solução 2.

Desvantagens: você precisa (você?) se preocupar com a retenção de dados.

Opção 2 - rrdtool :

Defina o arquivo de base de dados rrd, a definição de dados e as funções de agregação. Após o tempo, alimente o banco de dados com rrdtool update ... .

Vantagens: você pode gerar facilmente gráficos com rrdtool graph ... . Nenhum problema de retenção de dados (banco de dados round robin).

Desvantagens: pouco mais difícil definir o banco de dados rrd em comparação com a tabela / visualização SQL simples

    
por 23.01.2012 / 16:13