traduccion tiene segundos segundo pasaje minutos milisegundos milisegundo milesimas microsegundos cuantas convertir conversor f# timer f#-interactive

f# - tiene - pasaje de milisegundos a minutos



300 milisegundos solo para una declaraciĆ³n de variable en F#Interactivo? (2)

Daniel tiene razón: si defines una variable en una interacción de FSI separada, entonces se representa de manera diferente.

Para obtener una comparación correcta, debe declarar la variable como local en ambos casos. La forma más fácil de hacerlo es anidar el código bajo do (que convierte todo lo que está por debajo de do en un ámbito local) y luego evaluar todo el bloque do a la vez. Vea el resultado de los siguientes dos ejemplos:

// A version with variable declaration excluded do let mutable a=1 let stopWatch = Stopwatch.StartNew() for i=1 to 200100100 do a <- a + 1 stopWatch.Stop() printfn "stopWatch.Elapsed: %f" stopWatch.Elapsed.TotalMilliseconds // A version with variable declaration included do let stopWatch = Stopwatch.StartNew() let mutable a=1 for i=1 to 200100100 do a <- a + 1 stopWatch.Stop() printfn "stopWatch.Elapsed: %f" stopWatch.Elapsed.TotalMilliseconds

La diferencia que obtengo cuando los ejecuto no es medible.

Estoy jugando con la consola interactiva F # y comparando el tiempo de ejecución de algunas operaciones numéricas. En este código, el tiempo de ejecución total parece duplicarse solo repitiendo la declaración de una variable.

En VS 2010 hago:

open System.Diagnostics let mutable a=1

Luego selecciono esto a continuación y lo ejecuto con Alt + Enter

let stopWatch = Stopwatch.StartNew() for i=1 to 200100100 do a <- a + 1 stopWatch.Stop() printfn "stopWatch.Elapsed: %f" stopWatch.Elapsed.TotalMilliseconds

toma más o menos: 320 ms

ahora selecciono esto y presiono Alt + Enter:

let mutable a=1 let stopWatch = Stopwatch.StartNew() for i=1 to 200100100 do a <- a + 1 stopWatch.Stop() printfn "stopWatch.Elapsed: %f" stopWatch.Elapsed.TotalMilliseconds

casi doble: 620 ms

El mismo bloque pero que incluye la declaración en la parte superior lleva casi el doble. ¿No debería ser lo mismo desde que declaro la variable antes de Stopwatch.StartNew ()? ¿Tiene esto que ver con la consola interactiva? Tengo los mismos resultados usando la directiva #time.


No estoy convencido de que ninguna de las respuestas sea correcta. Creo que a tiene la misma representación en ambos casos. Y con eso quiero decir que un tipo individual se emite de forma dinámica envolviendo ese valor mutable (¡ciertamente en el montón!). Necesita hacer esto ya que en ambos casos, a es un enlace de nivel superior al que se puede acceder mediante interacciones posteriores.

Así que, dicho todo esto, mi teoría es la siguiente: en el primer caso, el tipo dinámico emitido por FSI se carga al final de la interacción, para generar su valor predeterminado. En el segundo caso, sin embargo, el ajuste de tipo a no se carga hasta que se accede por primera vez, en el ciclo, después de que se inició el StopWatch .