Tempo diferente chamado em ambientes semelhantes no bash

2

Foi-me dito que as pessoas que usam o bash terão que diferenciar entre os time e /usr/bin/time ( time(1) ) embutidos no shell. Eu tive que cronometrar um programa e também tive que encontrar maneiras de automatizar a entrada, usando echo e redirecionamento de string <<< . Estes são os resultados,

$ time python3 -c "a=input("");print(a)" <<< "12"
12

real    0m0.023s
user    0m0.020s
sys 0m0.000s

O shell built-in é chamado nesse caso.

$ echo "12" | time python3 -c "a=input("");print(a)"
12
0.01user 0.00system 0:00.02elapsed 100%CPU (0avgtext+0avgdata 6524maxresident)k
0inputs+0outputs (0major+593minor)pagefaults 0swaps

time(1) está sendo chamado nesse caso.

Por que isso está acontecendo? Eles são ambientes diferentes?

Usando o Ubuntu 14.04 x86_64

    
por kesari 31.08.2015 / 07:41

3 respostas

3

Existem dois tipos de comandos time . Um é o shell embutido, pertence ao bash. Essa é a que você vê no seu primeiro exemplo. O segundo é /usr/bin/time , o segundo que você viu. Quanto ao motivo pelo qual é uma saída diferente, é porque você não pode canalizar a saída para os recursos internos do shell. Mais sobre isso aqui

    
por 31.08.2015 / 07:55
5

A estrutura de um pipeline não permite tempo no meio, somente no início do pipeline.

Além disso, o tempo é uma "palavra-chave do shell", conforme mostrado por type time .

Mas nada proíbe o uso de comandos compostos (e tempo cada um) :

time comm1 | ( time comm2 )

Então, você poderia trabalhar com um sub-shell, assim:

echo "12" | ( time python3 -c "a=input("");print(a)" )

Ou também assim:

echo "12" | { time python3 -c "a=input("");print(a)"; }
    
por 31.08.2015 / 11:08
1

Se você gosta de comandos de tempo por motivos de performance, eu recomendo não usar / usr / bin / time mas sim ptime (1) se disponível em sua plataforma - ptime dá uma resolução de nanossegundo - ou usar um Bourne Shell recente , como o Bourne Shell permite o tempo automaticamente todos os comandos em primeiro plano (incluindo builtins shell) com uma resolução de microssegundos em todos os sistemas operacionais modernos. Para cronometrar todos os comandos de primeiro plano no Bourne Shell, chame: set -o time e defina TIMEFORMAT para um conteúdo útil para obter uma resolução maior, por exemplo: %6:E real %6U user %6S sys %P%% cpu %I+%Oio %Fpf+%Ww

/ usr / bin / time normalmente tem uma resolução fixa de 10ms ou 1ms.

    
por 31.08.2015 / 11:39