+1

Medindo a Velocidade do seu Código

criado por Sergio A. Pohlmann .'. em 21/01/2003 12:01am
Dentro do restante do programa, simplesmente usamos os algoritmos a serem testados, com as respectivas variáveis, para os cálculos. Vejamos:

Primeiro, estamos definindo um contador para o número de dados que vamos buscar (o número depende de que aplicação está você fazendo com seu algoritmo, e da velocidade com a qual ele responde).

Depois, inserimos 10000 números, sequenciais, em uma matriz, e a embaralhamos (para que os dados fiquem totalmente randomizados, aí dentro), com a função "shuffle()".

<?php
$nn = 5; // A single counter

// Making an array with 10000 numbers
for ($i = 0; $i < 10000; $i++) {
    $array[$i]= $i; // put a number in the current element
}

// Shuffling the array
shuffle($array);
?>

Agora, os testes. Testamos com o algoritmo do loop, que busca elemento por elemento, e, se encontra o valor, avisa que o encontrou (sabemos que sempre vai encontrar, neste caso, mas o que queremos é saber com que velocidade encontra).

Observe que antes de iniciar o algoritmo, setamos a variavel $start que conterá o valor inicial de tempo. No final do mesmo, definimos a variável $end com o valor final, calculamos o tempo transcorrido entre as duas, e o imprimimos:

<?php
// First, with a single loop
$start = time_check(); // Actual time (start)
echo "<hr>Test with a loop<br>\n";
for ($number = 1; $number <= $nn; $number++) {
    // Finding a number
    for ( $loop=0; $loop<10000; $loop++ ) {
        if ( $array[$loop] == $number ) {
            echo "Found $number <br> ";
        }
    }
}
$end = time_check(); // Atual time (end)
$time = $end - $start; // Calculate a transcurred time
echo "<br>Total Time: $time<br>"; // Show the time
?>

Como o outro algoritmo testado, o processo de tempo é o mesmo:

<?php
// Now, with the internal function
$start = time_check(); // Actual time (start)
echo "<hr>Test with a function<br>\n";
for ($number = 1; $number <= $nn; $number++) {
    // Finding a number
    if (in_array($number, $array)) {
        echo "Found $number <br> ";
    }
}
$end = time_check(); // Atual time (end)
$time = $end - $start; // Calculate a transcurred time
echo "<br>Total Time: $time<br>"; // Show the time
?>

Só por curiosidade, neste caso, os valores obtidos em um de meus testes aqui foram:

Com o loop 5.3479089736938
Com a função 0.26176810264587

Onde a diferença entre usar uma ou outra solução é mais do que óbvia.
Ah! Por aí, pode desejar saber quantas vezes uma rotina é mais rápida que a outra, então, basta dividir uma pela outra, o que, em nosso caso, resulta em: 20,42994895 Uau!!!!!!!

Por fim, algumas pequenas observações:

- Não esqueça que cada vez que execute a página, os valores poderão variar, porque dependem de diversos fatores (servidor, memória, velocidade da rede, ou da conexão, sobrecargas momentâneas, etc). Então, sempre teste várias vezes, e tire a média dos resultados obtidos. Assim, terá um valor mais próximo da realidade.
- Se que testar velocidade de seus próprios algoritmos, é bom fazê-lo quando o servidor está completamente desocupado, para evitar que o tráfego de outros possa influir em suas provas.
- Também, nestes casos, se puder, use um servidor pequeno. Pode parecer bobagem, mas, se o seu programa funciona bem em um equipamento pequeno, terá mais possibilidades de que funcione bem, quando em um servidor definitivo. No meu caso, meu servidor, para desenvolvimento, é um "fantástico" pentium 75MHz, com 32 Mb de RAM. Posso assegurar que, se funciona "nisto", vai funcionar em qualquer cliente ;o)

Espero ter sido útil.

Abraços a todos,
Sérgio A. Pohlmann

Comentários:

Mostrando 1 - 3 de 3 comentários
a disse:
Tb achei excelente!!
Muito inteligente!
19/06/2003 10:22pm (~21 anos atrás)

Excelente. Tua observaçao, seguramente vai melhorar bastante as medidas que o pessoal tomar. Realmente, é importante, e faz diferença.
Justamente, quando se está buscando melhores velocidades, o melhor é experimentar coisas assim, como inverter determinadas posiçoes, etc, ainda que isto, muitas vezes, possa nao fazer muito sentido.
E, discutir o tema, com a comunidade, seguramente, só nos vai trazer um enriquecimento, e um melhor entendimento desta excelente linguagem.
Obrigado pela contribuiçao,
Abraços

Sergio




21/01/2003 9:55am (~21 anos atrás)

Em primeiro lugar parabéns pelo artigo.
A +- uma semana, avia começado a usar está "manha".
Em segundo quero chamar atenção, para algumas descobertas que podem interferir no resultado final desta "manha".
1) A ordem com que os blocos de código aparece faz diferência. Pude comprovar isto com apenas um teste simples. De valor a variaves, (com nomes diferentes, pois isso influência) no lugar dos loops, por exemplo:
//......
$start = time_check();
$s = 'Ola! Mundo cruel';
$end = time_check();
//......
$start = time_check();
$d = 'Ola!';
$start = time_check();
//......
//End
Rode e anote os valores.
Agora altere as variaveis de lugar.
Você vera uma sensivel queda mais, poderar checar que a mudança de lugar acarretou diferença de tempo, e não o código em si.
Fica evidenciado que dar ao valor a $s é mais demorado, mais não tanto.
Essa diferença de tempo ocorro por varios motivos o principal é:
1) Se a váriavel ainda não foi definido o kernel do php vai levar mais tempo para fazelo.
2) Da mesma maneira se a várivel já foi usada, menos tempo para acessala !

Em fim, fassão seus teste e observe o rezultados, isso tudo é muito dificil de ser analizado, como o Sergio mesmo dice a varios fatores que dão influência nesta medida.

A unica maneira de se saber realmente qual função e de fato melhor, e estudar o código do php, ou seja e ler código c, que não tem fim. Como isso nem sempre é possivel a melhor mesmo e estudar os códigos e observar seu comportamento. Depois discutir com seus amigos programadores.

Se alguem obter resultados diferentes por favor me avise, não quero continuar na escuridão se nela estiver!
21/01/2003 6:34am (~21 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)