Time Code em PLT-Scheme
Pergunta
Eu quero ver quanto tempo uma função leva para executar. Qual é a maneira mais fácil de fazer isso em PLT-Scheme? Idealmente, eu gostaria de ser capaz de fazer algo parecido com isto:
> (define (loopy times)
(if (zero? times)
0
(loopy (sub1 times))))
> (loopy 5000000)
0 ;(after about a second)
> (timed (loopy 5000000))
Took: 0.93 seconds
0
>
Não importa se eu teria que usar alguma outra sintaxe como (timed loopy 5000000)
ou (timed '(loopy 5000000))
, ou se ele retorna o tempo gasto em uma cons ou algo assim.
Solução
O nome padrão para cronometrar a execução de expressões na maioria das implementações esquema é "tempo". Aqui está um exemplo de dentro DrRacket.
(define (vezes loopy) (Se (zero? Vezes) 0 (Loopy (vezes Sub1))))
(time (loopy 5000000)) tempo de CPU: 1526 tempo real: 1657 tempo gc: 0 0
Se você usar o tempo para referência implementações diferentes uns contra os outros, lembre-se de usar a raquete na linha de comando ao invés de aferição diretamente em DrRacket (DrRacket inserções código de depuração, a fim de dar melhores mensagens de erro).
Outras dicas
A ele ...
A partir da on-line documentação :
(time-apply proc arg-list)
invoca o proc procedimento com os argumentos arg-list. Quatro valores são retornados: uma lista contendo o resultado (s) de aplicação de proc, o número de milissegundos de tempo de CPU necessário para obter este resultado, o número de milissegundos `` real '' necessários para o resultado, e o número de milissegundos de tempo de CPU (incluído no primeiro resultado) gasto na coleta de lixo.
Exemplo de utilização:
> (time-apply loopy '(5000000))
(0)
621
887
0