2011-01-28 24 views
5

Estoy sincronizando algunos algoritmos y se me ocurrió la función de tiempo a continuación. Sin embargo, siempre devuelve 0 ms.¿Por qué esta función de tiempo mide siempre 0 ms?

La pregunta es por qué siempre es 0ms cuando claramente toma unos segundos. Soy un desarrollador de F #, por lo que probablemente me falten algunos conceptos.

Tenga en cuenta que la cuestión no se trata de un algoritmo de Fibonacci más eficiente y también sé que la función es medir el tiempo del mundo real en lugar de tiempo de CPU (que puede ser obtenido por Sys.time())

let time f x = 
    let timer = new System.Diagnostics.Stopwatch() 
    timer. Start () 
    try f x finally 
    printf "Took %dms" timer.ElapsedMilliseconds;; 

let rec fib x = 
    if x < 2 then 1 
    else fib(x-1) + fib(x-2) 

time Array.iter (fun x -> ignore (fib x)) [| 1 .. 40 |] 

Gracias por cualquier ayuda y punteros para un comienzo F # desarrollador

Saludos, Tom

Respuesta

6

El problema es que su función de tiempo de espera en función de un argumento, sino que está llamando con dos argumentos uno:

time Array.iter (fun x -> ...) [|1..40|] 
       ^- first arg ^- second arg 

Para obtener el resultado que desea, utilice paréntesis

time (Array.iter (fun x -> ignore (fib x))) [| 1 .. 40 |] 
     ^- a single partially curried function ^- a single argument 

Por ejemplo, en el FSI:

> time (Array.iter (fun x -> ignore (fib x))) [| 1 .. 40 |];; 
Took 6589msval it : unit =() 

Mejor aún, si está probando en F # interactivo, use la directiva #time y FSI le asignará el horario adecuado. Ejemplo:

> #time;; 

--> Timing now on 

> Array.iter (fun x -> ignore (fib x)) [| 1 .. 40 |];; 
Real: 00:00:06.816, CPU: 00:00:06.218, GC gen0: 0, gen1: 0, gen2: 0 
val it : unit =() 
5

Su problema es que debido a la forma en que funciona la aplicación función, que está haciendo esto:

((time Array.iter) (fun x -> ignore (fib x))) [| 1 .. 40 |] 

así que estás medir cuánto tiempo se necesita para aplicar Array.iter al valor de la función fun x -> ignore (fib x), que no toma mucho tiempo en absoluto, y los resultados en otra función del tipo int array ->(), que usted está aplicando a continuación, [| 1 .. 40 |]. En su lugar, usted debe tratar

time (Array.iter (fun x -> ignore (fib x))) [| 1 .. 40 |] 
Cuestiones relacionadas