AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1515767
Accepted
dmkonlinux
dmkonlinux
Asked: 2024-05-29 21:43:52 +0800 CST2024-05-29 21:43:52 +0800 CST 2024-05-29 21:43:52 +0800 CST

Devo usar a palavra-chave "time", o comando "/usr/bin/time" ou o "times" integrado para cronometrar a execução de comandos no bash?

  • 772

Estou investigando o bash pela primeira vez e quero tentar testar algum código para comparar diferentes maneiras de atingir o mesmo objetivo. Como parte disso, descobri os métodos de tempo e tempo para registrar o tempo de execução do código. Para um script simples de uma linha criado por meio de:

echo "echo a script" > script

Eu recebo:

$ time bash ./script
a script

real    0m0.009s
user    0m0.006s
sys 0m0.002s

$ times bash ./script
0m0.082s 0m0.074s
0m0.019s 0m0.041s

$ /usr/bin/time bash ./script
a script
0.00user 0.00system 0:00.00elapsed 80%CPU (0avgtext+0avgdata 3328maxresident)k
0inputs+0outputs (0major+148minor)pagefaults 0swaps
$ type -a time
time is a shell keyword
time is /usr/bin/time
time is /bin/time
$ type -a times
times is a shell builtin

$ which -a time
/usr/bin/time
/bin/time

bash -c helpme leva para:

$ help time
time: time [-p] pipeline  
    Report time consumed by pipeline's execution.

$ help times
times: times  
    Display process times.

E man timeme dá:

TIME(1)..........Manual de Comandos Gerais..........TIME(1)

Hora NAME - execute programas e resuma o uso de recursos do sistema

Os usuários do shell bash precisam usar um caminho explícito para executar o comando de tempo externo e não a variante interna do shell. No sistema onde o horário está instalado em /usr/bin, o primeiro exemplo seria/usr/bin/time wc /etc/hosts

O manual de referência do bash descreve timecomo uma palavra reservada que tem "um significado especial para o shell. Eles são usados ​​​​para iniciar e terminar os comandos compostos do shell", enquanto timesé descrito como um comando interno do shell , "herdado do Bourne Shell. Esses comandos são implementados conforme especificado pelo padrão POSIX".

Além de uma linha no manual dizendo:

O uso de time como uma palavra reservada permite o tempo de componentes internos do shell, funções do shell e pipelines. Um comando de tempo externo não pode cronometrar isso facilmente.

Não consigo ver o raciocínio para três comandos muito semelhantes.

Qual devo usar para testar diferentes abordagens e otimizar meus scripts?

command-line
  • 1 1 respostas
  • 537 Views

1 respostas

  • Voted
  1. Best Answer
    kos
    2024-05-29T22:43:54+08:002024-05-29T22:43:54+08:00

    times(construídas em)

    times- conforme help times:

    Imprime os tempos acumulados do usuário e do sistema para o shell e todos os seus processos filhos.

    Ênfase em “acumulado” e “para o shell e todos os seus processos filhos”. Não aceita nenhum argumento e não mede o tempo de execução de outro comando: imprime o tempo atual do usuário e do sistema gasto pelo shell e seus filhos para sua própria execução.

    Por exemplo, se eu quisesse printfuma string vazia um milhão de vezes, o tempo que um shell levaria para executar todos esses comandos seria significativo (foco no primeiro campo das linhas comentadas):

    > times; for x in {1..1000000}; do printf ''; done; times
    # running printf a million times in the current shell
    0m0,021s 0m0,000s # shell's user time is about 0
    0m0,009s 0m0,003s
    0m2,232s 0m0,087s # shell's user time increased by about 2 seconds
    0m0,009s 0m0,003s
    > times; (for x in {1..1000000}; do printf ''; done); times
    # running printf a million times in a subshell
    0m2,239s 0m0,090s
    0m0,009s 0m0,009s # shell's children user time is about 0
    0m2,239s 0m0,096s
    0m2,308s 0m0,153s # shell's children user time increased by about 2 seconds
    

    O que lhe confere uma finalidade completamente diferente de time(palavra reservada) e /usr/bin/time(executável). Na maioria das vezes (trocadilho não intencional), em scripts, você usará timee /usr/bin/time.

    time(palavra reservada) / /usr/bin/time(executável)

    Como @terdon observa de forma crucial, um time"utilitário" implementado de tal forma que "pode ​​ser acessado através da família de funções exec" deve estar presente em um sistema para ser compatível com POSIX 1 ; isso, por si só, justifica a presença de /usr/bin/timealém de time.

    As diferenças mais significativas entre a palavra reservada e o executável são:

    • A primeira é uma instalação shell. O que significa que você sempre poderá usá-lo no Bash (e eu acho que na maioria dos shells), mas não necessariamente poderá usar o segundo em um sistema não compatível com POSIX; por outro lado, se você estiver executando um shell que não possui o primeiro, dependendo do sistema e de sua conformidade com POSIX, você ainda poderá usar o segundo. Falando realisticamente, eu pessoalmente nunca usei uma distro que não tivesse Bash ou /usr/bin/time. Observe também que, em geral, os executáveis ​​integrados geralmente são executados mais rapidamente do que os executáveis ​​externos.
    • O primeiro pode ser aplicado a built-ins, funções, listas e subshells; o segundo pode não.
    time printf ''
    function foo() {}; time foo
    time { foo; bar; }
    time (foo)
    

    Portanto, na prática, pelo menos no Ubuntu, no que diz respeito a um único comando, a diferença entre os dois se resume principalmente ao formato em que a saída é impressa.

    Usando a palavra reservada você tem pouca personalização de saída disponível (basicamente você pode imprimir usando o formato padrão e um formato compatível com POSIX), enquanto usando o executável você tem muito mais opções disponíveis (veja Recursos man time).

    > time sleep 5; printf '\n'; /usr/bin/time sleep 5
    
    real    0m5,002s
    user    0m0,001s
    sys     0m0,000s
    
    0.00user 0.00system 0:05.00elapsed 0%CPU (0avgtext+0avgdata 2176maxresident)k
    0inputs+0outputs (0major+95minor)pagefaults 0swaps
    

    1. Do link:

    Qualquer um dos utilitários padrão pode ser implementado como utilitários integrados regulares no interpretador de linguagem de comando. Isso geralmente é feito para aumentar o desempenho de utilitários usados ​​com frequência ou para obter funcionalidades que seriam mais difíceis em um ambiente separado. [...] No entanto, todos os utilitários padrão, incluindo os integrados regulares na tabela, mas não os integrados especiais descritos em Utilitários Integrados Especiais, devem ser implementados de forma que possam ser acessados por meio da família de funções exec conforme definido no volume System Interfaces do POSIX.1-2008 e pode ser invocado diretamente pelos utilitários padrão que o exigem (env, find, nice, nohup, time, xargs).

    • 7

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve