Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá.
Estou fazendo um projeto e precisaria calcular o tempo de processamento de determinadas funções. Pesquisando, encontrei o seguinte código:
<?php
for ($i=0; $i<100000000; $i++)
continue;
$tempo_carregamento = mktime() - $_SERVER['REQUEST_TIME'];
print "A página demorou {$tempo_carregamento} segundos para carregar.";
?>
Entretanto, não satisfaz minhas necessidades, pois preciso calcular o tempo com a precisão de milisegundos. É possível fazer isso utilizando php? Se sim, alguém saberia me ajudar com isso?
Obrigado.
>
Basta fazer com a função microtime().
Certo, para tempos significativos mostrou corretamente. Mas aí fiz um laço menor para testar e apareceu o tempo neste formato:
Did nothing in 2.8133392334E-5 seconds
Saberia me dizer o que pode ser isso? Até por que minha necessidade realmente é trabalhar com intervalos de tempo pequenos, já que preciso analisar o tempo de processamento de diferentes algoritmos.
Obrigado.
Esse formato é a notação científica para pontos flutuantes pequenos (números pequenos demais para serem exibidos normalmente utilizando a precisão de um inteiro).
Você está construindo um programa específico para analisar algoritmos, ou apenas precisa analisá-los para tomar decisões? Se for o segundo caso, sugiro que você aprenda a utilizar um profiler. Dá uma olhada nesse artigo:
http://www.gnegg.ch/2006/08/profiling-php-with-xdebug-and-kcachegrind/
Com um profiler você conseguirá medir os gargalos de sua aplicação e tudo mais.
Uma dica talvez mais valiosa ainda é: não otimize nenhum algoritmo se não for absolutamente necessário. Otimizar durante o projeto é frequentemente um erro ;) Otimização é um caso em que remediar é mais produtivo do que prevenir.
Pois é, o problema é que é justamente para analisar o desempenho de diversos algoritmos de ordenamento.
Eu precisaria que medisse tempos realmente pequenos, já que um vetor com 10, 100 elementos, por exemplo, é ordenado de forma muito rápida. Pensei em fazer isso utilizando o php, que é a linguagem que mais gosto de trabalhar, mas pelo jeito terei que utilizar alguma outra.
Não existe solução para a medição de valores tão pequenos em php então?
Obrigado.
Não há nenhum problema com a precisão. O número só está em uma notação diferente, para que possa ser exibido. Duvido muito que você vá utilizar uma precisão mais alta do que 14 dígitos decimais...
2.8133392334E-5 na verdade significa 0.0000028133392334. Isso é um milésimo de segundo dividido por alguns milhões, é insignificante, mesmo. Pequenas variações de energia elétrica causam mais variação no processamento (e diferenças no tempo de execução) do que isso.
Interessante.. Então se eu fizer a mesma coisa em C, por exemplo, também vai dar algo insignificante desse jeito certo? Ou seja, independente da linguagem o tempo será sempre mímimo desta forma?
E aproveitando: como você chegou a conclusão de que 2.8133392334E-5 e 0.0000028133392334 são o mesmo número? O algarismo 5 que aparece em E-5 tem relação com o número de zeros depois da vírgula ou é apenas uma coincidência?
Sim, provavelmente em outras linguagens o tempo vai ser insigificante. Talvez ainda mais insignificante. Algoritmos puros são extremamente rápidos em qualquer linguagem, o que realmente consome tempo são operações com bancos de dados, rede e sistemas de arquivo ;)
Então, não é uma coincidência o número. É o número de zeros mesmo...
25E8 significa 2500000000 (oito zeros pra direita).
25E-8 significa 0.000000025 (oito zeros pra esquerda).
Suspeitei desde o pricípio hehehehhe.
Última pergunta, por garantia: na descrição da função no manual diz que a função fornece o tempo em microsegundos, mas nos exemplos de utilização está escrito "Did nothing in $time seconds\n". Enfim, a função retorna o tempo em segundos ou microsegundos afinal?
E aproveitando: existe alguma forma da função que retorne o tempo diretamente em milisegundos?
Basta fazer com a função microtime().