Tema
Divisão por zero
Métricas de desempenho quase sempre dividem por alguma coisa: tempo de resposta divide pela vazão, utilização divide pela capacidade. Quando o divisor pode chegar a zero, a execução para com erro.
O erro
NON_FINITE_METRIC: a métrica 'X' produziu um valor não-finito (Infinity/NaN)
A execução é interrompida de propósito. A alternativa seria devolver um resultado inválido que apareceria como um traço na tabela ou um zero no gráfico — e você não teria como distinguir de um valor legítimo.
Quando acontece de verdade
Aqui há uma sutileza que evita preocupação desnecessária.
A conta não é feita a cada instante. Primeiro a ferramenta calcula a média de cada quantidade ao longo da simulação, e só então faz a divisão. Veja Médias e probabilidades.
A consequência
Um lugar que fica vazio de vez em quando não causa problema: a média dele continua maior que zero. O erro acontece quando a média é zero — ou seja, quando o lugar esteve vazio praticamente o tempo todo.
Na prática, três situações:
| Situação | Por quê |
|---|---|
| O lugar nunca recebe ficha | erro de modelagem: um arco faltando, ou uma transição que nunca dispara |
| A simulação é curta demais | nada chegou lá ainda no tempo simulado |
| Análise transiente | naquele instante o lugar está vazio em quase todas as repetições |
A proteção
Envolva a divisão num IF que testa o divisor:
IF E{#Concluidos} > 0 THEN E{#Fila} / E{#Concluidos} ELSE 0Se o divisor for zero, a métrica devolve 0 em vez de quebrar a execução.
O zero é uma resposta, não um resultado
Depois de proteger, um 0 na tabela pode significar duas coisas: o valor realmente é zero, ou a proteção entrou em ação. São situações muito diferentes, e a métrica não distingue uma da outra.
Se aparecer um zero inesperado, verifique se o divisor tem valor. É o primeiro lugar para olhar.
Melhor que proteger: não dividir pelo que pode zerar
A proteção evita a parada, mas não devolve a resposta certa. Quando possível, reescreva a métrica para dividir por algo que você já conhece.
Em vez de dividir pela vazão medida, multiplique pelo tempo entre chegadas, que é um parâmetro seu e nunca é zero:
(E{#Fila} + E{#EmAtendimento}) * TEMPO_ENTRE_CHEGADASEssa versão não precisa de proteção nenhuma, e funciona também na análise transiente. A página Medir tempo de resposta compara as duas com números.
Checklist
Antes de rodar, para cada métrica que tenha uma barra:
- O divisor pode ser zero? Se for um parâmetro seu, não pode — está seguro.
- Se for a média de um lugar, esse lugar recebe fichas com frequência?
- Se a resposta for "às vezes fica vazio", está seguro — a média é o que conta.
- Se for "quase sempre vazio", proteja com
IFe reveja se é o lugar certo para medir.