Back-End

20 fev, 2009

Ruby Snapshot: Cronômetro de código

Publicidade

Um exemplo de artigo de códigos rápidos e úteis – nem sempre tão úteis – utilizando Ruby (os Snapshots). Vou mostrar como fazer um “cronometro” de código. Calma, vou explicar melhor.

Antes de iniciar, quero lembrar a existência do modulo Benchmark, que é o mais indicado a ser utilizado neste caso. Levamos em conta então que este post servirá apenas para estudo.

Muitas vezes quero saber quanto tempo um determinado trecho de código leva para ser executado, assim posso fazer otimizações bem focadas em determinadas linhas.

Ruby é uma linguagem que torna simples a manipulação de blocos de código, por isso criaremos um método que receberá um determinado código que, além de executar essas instruções passadas, dirá quanto tempo levou para fazer isso. Seu funcionamento é bem simples, mostrando apenas o tempo real que o código levou para ser executado, não é 100% preciso, mas em linhas gerais é bem eficiente. Segue o método:

def benchmark(benchmark_name)
  return unless block_given?
  initial = Time.now
  yield
  final = Time.now.to_f - initial.to_f
  puts "Benchmark #{benchmark_name}: [#{final}] seconds."
end
 
benchmark 'Sleep Test' do
  sleep 0.318
end

Primeiro ele verifica se foi passado o bloco de código que vai ser “analisado”. Em seguida, o tempo inicial é armazenado, o código é executado (yield) e por fim diminui-se o tempo inicial do tempo no momento em que o código termina de ser executado. É impresso na tela a identificação do teste (para os casos de haver mais de um) junto com o tempo que o código levou para ser executado, em segundos.

Para testar o método usei o sleep, que faz uma interrupção no código durante um determinado tempo, no caso 318 milissegundos. Ao rodar esse teste é possível notar que nunca dá 318 milissegundos no bechmark. Isso porque os métodos sleep e o bechmark não são exatos.

É possível fazer diversas melhorias nesse método, o que é um bom exercício para estudar a linguagem. Qualquer sugestão é bem-vinda.