Como comandos de tempo médio?

18

Estou timeusando alguns dos meus comandos. Agora, para calcular a média das medidas, eu gostaria de executar e cronometrar meus comandos um número especificado 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?

Didier Trosset
fonte

Respostas:

7

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
bhdnx
fonte
usando os.system(), causa a sobrecarga de chamar / criar um shell com cada comando. Provavelmente é melhor usar subprocess.call ()
Anthon
verdade, mas seria provável constante-ish de qualquer maneira
bhdnx
4

Não é exatamente uma ferramenta UNIX ou GNU / Linux, mas você pode usar confortavelmente o ambiente de software R para computação estatística . (Não consigo encontrar nada mais específico para sua tarefa .)

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

Edit2 Acabei de ver esta pergunta, "Medindo o tempo dentro de um script" na coluna "Relacionada" à direita, isso também poderia ser usado, ou seja, dedique tempo, faça loop for-time ( Nvezes), dedique 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).

sr_
fonte
3

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

Por exemplo, você pode usar o tempo GNU para gravar várias medidas 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 algumas impressões bonitas da saída R, 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
maxschlepzig
fonte
1

Opção 1 - sqlite :

crie uma tabela simples com colunas de comando e tempo e visualize com cálculos de 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 (precisa?) De se preocupar com a retenção de dados.

Opção 2 - rrdtool :

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

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

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

Michał Šrajer
fonte