2011-01-15 16 views
19

Soy nuevo en f #. He descargado el Visual Studio 2010 Shell y el F # CTP y escribí un pequeño script hola mundo con el código siguientef # compilando demasiado lento

printfn "Hello World" 
let _ = System.Console.ReadLine() 

Esto toma alrededor de 13 a 15 segundos para compilar que es muy lento en comparación a la ejecución de un script parecido C# (que toma alrededor de 2 segundos). Me gustaría que el script F # compile más rápido para que mi tiempo de desarrollo (es decir, la experimentación) se reduzca, no me importa el rendimiento del tiempo de ejecución.

¿Hay alguna manera de hacer que la secuencia de comandos F # se compile más rápido, tal vez activar/desactivar algunas configuraciones de compilación en Visual Studio o algo así?

FYI, estoy usando una máquina Pentium 4, 1.5 gb RAM de 4 años, si eso ayuda.

+1

Nunca he notado algo así. Una prueba rápida y compilo y corro en menos de 2 segundos. Aunque estoy ejecutando un sistema de gama alta. – gradbot

+0

Estoy ejecutando un AMD Athlon 2008, nada demasiado elegante, y se compila en 3 segundos. –

+0

Ja, tuve este problema. Pasó de 10 segundos para compilarse a menos de medio segundo. Loco por la diferencia que hace ngen. –

Respuesta

39

No tengo idea de qué tan rápido un Pentium 4 debe compilar ese programa "hello world", pero 15 segundos me parece bastante lento. Una vez tuve problemas de velocidad similares con un VS 2010 Beta y el problema resultó ser que Visual Studio y el compilador F # aún no estaban correctamente NGENed.

Normalmente, la instalación de Visual Studio debe asegurarse de que todo se NGEN, pero tal vez algo salió mal.Puede comprobar si el F # compilador se NGENed con el siguiente comando en una ventana de consola con derechos de administrador:

cd "C:\Program Files\FSharp-2.0.0.0\bin" 
c:\windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe display fsc.exe 

Si el resultado de esa muestra que la imagen nativa de fsc.exe aún está pendiente, se puede forzar la compilación con :

c:\windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe executeQueuedItems 

Nota: no estoy seguro de qué versión de la F # compilador que está utilizando exactamente. El utilizado por la instalación completa de VS2010 es el que está en C:\Program Files\Microsoft F#\v4.0 (o C:\Program Files (x86)\Microsoft F#\v4.0 en máquinas de 64 bits). Por lo tanto, si usa ese, tiene que cd en esa carpeta en lugar de la carpeta C:\Program Files\FSharp-2.0.0.0\bin.

+1

Hola, después de ejecutar ngen, el tiempo de compilación cayó a 4 segundos y eso efectivamente solucionó mis problemas. Gracias. – user547057

+2

Acabo de tener el mismo problema. Difícil de creer que este sigue siendo un problema –

+0

Podría tomar tiempo y espacio en el disco para compilar todos los artículos en cola. Probablemente uno debería especificar la prioridad al final 'c: \ windows \ Microsoft.NET \ Framework \ v4.0.30319 \ ngen.exe executeQueuedItems 3' para compilar solo libs con la misma prioridad que fsc.exe o usar el comando' ngen install' solo para fsc.exe. –

6

Lamentablemente, no hay mucho que pueda hacer: el compilador F # es más lento que el compilador C#. Pero permítanme explicar por qué:

Por qué el F # compilador es más lento que el compilador de C#

En primer lugar, el F # compilador está escrito en .NET, el compilador de C# está escrito en C++. Si bien esto solo no es una sentencia de muerte para perf, sí hace la diferencia. En segundo lugar, el compilador de C# tiene más de 10 años. Ha habido un lote de tiempo para ajustarlo y optimizarlo, tanto el compilador como el tiempo de ejecución .NET. El motor .NET JIT se ha ajustado para C#/VB.NET y no para F #. La programación funcional requiere una gran cantidad de objetos efímeros, lo que se traduce en un tipo diferente de comportamiento del GC.

Pero la verdadera razón por la cual el compilador F # es notablemente más lento que el compilador C# es porque está haciendo más trabajo que el compilador C#. En C#, proporciona toda la información del tipo, que de alguna manera está haciendo el trabajo para el compilador. Por otro lado, F # teclea la inferencia, lo que, si bien te ahorra la carga de la anotación, requiere un tiempo de CPU adicional.

Lo que puede hacer

recomiendo descargar el Visual Studio 2008 Shell y utilizar F focalización .NET Framework 2.0 #. A menos que necesite algo que esté en Visual Studio 2010 o CLR 4.0 solamente, estará bien en Visual Studio 2008. El lenguaje F # funciona exactamente igual. La única diferencia, IIRC, es en qué tipos compilar ciertas cosas. Por ejemplo, hay un tipo Tuple < _> integrado en CLR 4.0, pero cuando se dirige a CLR 2.0 se utiliza el tipo de tupla definido en FSharp.Core.dll.

Visual Studio 2010 ofrece una gran cantidad de campanas y silbidos, como un editor de código basado en WPF. Sin embargo, esas sutilezas consumen mucha RAM y, en su caso, parece que puede vivir sin ellas.

+0

hola, gracias por responder. Estoy descargando el shell VS2008 y F # para .net 2 y veré si las cosas mejoran. En caso de que no sea así, creo que pospondré el intento de aprender F # durante 3 meses, ya que para entonces obtendré un 4 RAM RAM, un portátil i5 y con suerte el tiempo de compilación se reducirá. Dejaré la pregunta abierta por ahora, solo en caso de que alguien encuentre una solución o una mejor alternativa. – user547057

+0

Instalé vs2008 y no ha habido ninguna mejora en la velocidad de compilación. Tendré que esperar un tiempo, supongo :) – user547057

+0

hola, no acepté su respuesta y acepté la de Stephan Tolksdorf, porque sus sugerencias funcionaron. Espero que no te importe. – user547057

5

Tenga en cuenta también que puede usar F # Interactive para evaluar fragmentos de código o scripts, y como la ventana FSI en VS permanece abierta, es mucho más rápida (el tiempo de inicio para fsc.exe es malo).

+0

He probado el interactivo fsi para evaluar pequeños fragmentos y está bien, pero tengo que escribir ;; todo el tiempo y la falta de sangría automática es algo inconveniente para fragmentos más grandes. Gracias. – user547057

+6

Tenga en cuenta que el flujo de trabajo típico para FSI en VS es escribir código en un archivo VS de forma normal, pero luego resaltar fragmentos y presionar alt-enter para enviarlos a la ventana interactiva. Si estás escribiendo ;; o escribiendo directamente en la ventana, no se encuentra en el flujo de trabajo más típico. – Brian

+0

Tendré ese consejo en mente, aunque probablemente no lo use a menudo. – user547057

Cuestiones relacionadas