Como interpretar o tempo “real”, “usuário” e “sys”

0

Introdução

Eu ajustei o código para reduzir o processamento de 30 segundos para menos de um segundo em várias partes do meu programa bash. Estou tendo problemas para entender como o comando time funciona quando relata as variáveis real , user e sys .

Eu tenho este código:

echo " "
echo "Time to build DirsNdxArr from DirsArr $DirsArrCnt elements:"
DirsArrCnt=${#DirsArr[@]}
time for (( i=1; i<$DirsArrCnt; i=i+$DaElementCnt )); do
    DirsNdxArr["${DirsArr[$i]}"]=$i
    AllItemSizes=$(( $AllItemSizes + ${DirsArr[$(( $i + $ColFileSizes - 1 ))]} ))
done

echo " "
echo "Time to build FilesNdxArr from FilesArr $FilesArrCnt elements:"
FilesArrCnt=${#FilesArr[@]}
time for (( i=0; i<$FilesArrCnt; i=i+$FaElementCnt )); do
    FilesNdxArr["${FilesArr[$i]}"]=$i
    AllTagSizes=$(( $AllTagSizes + ${FilesArr[$(( $i + $FaColFileSizes ))]} ))
done

Isso informa isso:

Time to build DirsNdxArr from DirsArr 56700 elements:

real    0m0.149s
user    0m0.149s
sys     0m0.000s

Time to build FilesNdxArr from FilesArr 390 elements:

real    0m0.002s
user    0m0.002s
sys     0m0.000s

Por que sys tempo está reportando zero?

Interpretando a saída do comando time builtin, assumiríamos que o sistema não está fazendo nada, mas certamente não é isso que está acontecendo?

ps Eu sei que \n pode ser usado como uma nova linha para o parâmetro echo with -e . Meu hábito é sacrificar uma linha de franqueza e argumentos marginais em favor da legibilidade.

    
por WinEunuuchs2Unix 01.06.2017 / 02:51

1 resposta

3

Para encurtar a história, significa simplesmente que o seu programa não solicitou a realização de nenhuma tarefa privilegiada, portanto, a CPU não passou tempo no modo privilegiado (kernel).

Noções básicas primeiro

Primeiro, há várias coisas que você precisa entender para interpretar a saída de time corretamente:

  • qual comando time você está executando (porque há vários)
  • o significado de cada campo e o significado de cada um deles (leitura extra aqui )
  • a diferença entre o kernel e o modo de usuário

Existem dois tipos time command. Há shell embutido e há /usr/bin/time . O shell interno é o que você está usando e o padrão é mostrar três linhas, real , user e sys . O manual para time também menciona essa mesma forma de saída:

% bl0ck_qu0te%

E se você marcar a seção "FORMATANDO A SAÍDA", nós temos:

% bl0ck_qu0te%

De todas essas informações, podemos ver que há dois modos nos quais a CPU pode ser executada - modo de usuário e modo kernel, e o comando time exibe quanto tempo a CPU permanece em determinado modo para fazer o que seu programa / aplicativo solicitou CPU para fazer.

Entendendo o que é o relatório de tempo sys e o que significa valor 0

OK, então entendemos que a diferença é que há modo de usuário e modo kernel no qual o código pode ser executado. Nós já podemos imaginar que isso basicamente significa que o programa não usou o modo kernel para executar algumas tarefas. O que isso realmente significa?

Consulte a esta postagem :

% bl0ck_qu0te%

E de outra resposta no mesmo post:

% bl0ck_qu0te%

Então é isso que sua saída significa - não houve mudança para o modo kernel e a CPU não recebeu nenhuma interrupção do programa para fazer isso. Isso também significa que seu código não possui nada que exija privilégios elevados da CPU

Nota : isto provavelmente deve ser reformulado como "não houve mudança longa / perceptível no modo kernel", já que alocar memória com algo como malloc() function em C exigiria a mudança para o modo kernel, mas esses são switches microscópicos, que nós realmente precisamos investigar com um depurador ou com o comando strace .

    
por Sergiy Kolodyazhnyy 01.06.2017 / 03:39