Gráficos de rastreio em pilhas sobrepostas

O Cloud Profiler apresenta dados de criação de perfis através de gráficos de chamas. Ao contrário das árvores e dos gráficos, os gráficos de chamas usam o espaço do ecrã de forma eficiente, representando uma grande quantidade de informações num formato compacto e legível.

Para apresentar os gráficos de chamas, esta página ilustra como converter uma árvore num gráfico de chamas e resume as principais funcionalidades dos gráficos de chamas.

Criar um gráfico de rastreio em pilhas sobrepostas

Para criar um gráfico de chamas a partir de uma árvore, conclua os passos ilustrados no diagrama seguinte:

Criar um gráfico de chamas.

  1. Remova da árvore as setas que indicam chamadas de funções.

  2. Substitua cada nó da árvore por uma moldura.

    Os frames têm uma forma retangular e todos os frames têm a mesma altura. Para o exemplo nesta página, o tempo total da CPU usado pela função com o nome no frame determina a largura do frame.

    O pseudocódigo de cada uma das funções está descrito na tabela seguinte. O trabalho intensivo da CPU realizado durante a execução de uma função define o tempo da CPU próprio:

    Pseudocódigo de função Tempo da CPU próprio
    (segundos)
    Tempo total da CPU
    (segundos)
    func main():
         foo1()
         foo2()
         // CPU intensive work
         // for 2 seconds 
    2 4 + 3 + 2 = 9
    func foo1():
         bar()
         // CPU intensive work
         // for 1.5 seconds 
    1,5 2,5 + 1,5 = 4
    func foo2():
         bar()
         // CPU intensive work
         // for 0.5 seconds 
    0,5 2,5 + 0,5 = 3
    func bar():
         // CPU intensive work
         // for 2.5 seconds
    2.5 2.5

  3. O passo seguinte é remover o espaço vertical entre os frames e alinhar os frames à esquerda, mantendo as sequências de chamadas. Opcionalmente, pode definir um esquema de cores e colorir as frames de acordo com a definição. Por exemplo, pode colorir os frames pelo respetivo pacote, pelo tempo total da CPU, pelo tempo da CPU próprio ou por uma medida diferente.

    Depois de remover os espaços em branco excessivos e colorir os frames pelo tempo de CPU próprio, o gráfico de chamas aparece agora da seguinte forma:

    Imagem detalhada do gráfico de rastreio em pilhas sobrepostas.

    Repare que as pilhas de chamadas para foo1 e foo2 foram preservadas, mesmo que a pilha de chamadas que começa com foo2 esteja agora junto ao frame de foo1.

Resumo

Este exemplo simples ilustra o seguinte:

  • Os gráficos de chamas são uma representação compacta de uma árvore e pode recriar uma pilha de chamadas rastreando frames de cima para baixo.
  • Os frames dão nome a uma função e a largura do frame é a medida relativa do tempo total da CPU dessa função. Neste exemplo, uma vez que o tempo total da CPU de foo2 é um terço do tempo total da CPU de main, o frame de foo2 tem um terço da largura do frame de main.
  • A largura do espaço vazio abaixo de um frame é a medida relativa do tempo de CPU próprio para a função com o nome no frame. Por exemplo, abaixo da moldura foo1, 1,5 unidades estão vazias e 2,5 unidades estão ocupadas por bar. Assim, o tempo da CPU próprio de foo1 é de 37,5% do respetivo tempo total da CPU ou 1,5 s.
  • À medida que segue uma pilha de chamadas, as larguras dos frames diminuem porque o tempo total da CPU de um destinatário nunca pode ser superior ao tempo total da CPU do autor da chamada. Este comportamento é o que causa a forma de chama.

    No exemplo, foo1 chama bar e o tempo total da CPU de foo1 é definido como o tempo total da CPU de bar mais o tempo da CPU próprio de foo1. Por conseguinte, o tempo total de CPU de bar não pode ser superior ao tempo total de CPU de foo1.

O que se segue?