J'ai ce code:Est-ce que F # fait une mémoisation automatique?
for i in 1 .. 10 do
let (tree, interval) = time (fun() -> insert [12.; 6. + 1.0] exampletree 128.)
printfn "insertion time: %A" interval.TotalMilliseconds
()
avec la fonction de temps définie comme
let time f =
let start = DateTime.Now
let res = f()
let finish = DateTime.Now
(res, finish - start)
l'insert de la fonction n'est pas pertinente, autre que le fait qu'il n'utilise pas la mutation et retourne ainsi la même valeur à chaque fois.
-je obtenir les résultats:
insertion time: 218.75
insertion time: 0.0
insertion time: 0.0
insertion time: 0.0
insertion time: 0.0
insertion time: 0.0
insertion time: 0.0
insertion time: 0.0
insertion time: 0.0
insertion time: 0.0
La question est pourquoi le code calcule le résultat qu'une seule fois (à partir du moment de l'insertion, le résultat est toujours correct et égal)? Aussi, comment forcer le programme à faire des calculs plusieurs fois (j'en ai besoin pour le profilage)?
Edit: Jared a fourni la bonne réponse. Maintenant que je sais ce qu'il faut chercher, je peux obtenir le code du chronomètre de a timeit function for F#
J'ai eu les résultats suivants:
insertion time: 243.4247
insertion time: 0.0768
insertion time: 0.0636
insertion time: 0.0617
insertion time: 0.065
insertion time: 0.0564
insertion time: 0.062
insertion time: 0.069
insertion time: 0.0656
insertion time: 0.0553
+1. Juste pour être clair: le premier appel est plus lent pour le code natif (par exemple écrit en C), aussi, car il doit être chargé en mémoire, à partir de là dans le cache; prédiction de branche pourrait faire un pire travail la première fois, etc – Niki
+1 pour 'System.Diagnostics.Stopwatch', c'est votre bon ami pour le profilage – Brian
Merci. Cela fonctionne, et j'ai édité/fermé la question en conséquence. –