¿Hay alguna comparación de rendimiento C#/F # disponible en la web para mostrar el uso correcto del nuevo lenguaje F #?C#/F # Comparación de rendimiento
Respuesta
Aquí hay algunos enlaces en (o relacionados con) este tema:
- http://cs.hubfs.net/forums/thread/3207.aspx
- http://strangelights.com/blog/archive/2007/06/17/1588.aspx
- http://khigia.wordpress.com/2008/03/30/ocaml-vs-f-for-big-integer-surprising-performance-test/
- http://cs.hubfs.net/blogs/f_team/archive/2006/08/15/506.aspx
- http://blogs.msdn.com/jomo_fisher/
Lo que parece recordar de otro post en el blog de Robert Pickering (o era de Scott Hanselman?) Que, al final, porque ambos están sentados en el mismo marco, usted puede obtener el mismo rendimiento de ambos, pero a veces tiene que 'torcer' la expresión natural del idioma para hacerlo. En el ejemplo que recuerdo, tuvo que girar F # para obtener un rendimiento comparable con C# ...
El código natural F # (por ejemplo, funcional/inmutable) es más lento que el código C# natural (imperativo/mutable orientado a objetos). Sin embargo, este tipo de F # es mucho más corto que el código C# habitual. Obviamente, hay una compensación.
Por otro lado, puede, en la mayoría de los casos, lograr el rendimiento del código F # igual al rendimiento del código C#. Por lo general, esto requerirá la codificación en estilo imperativo o mutable orientado a objetos, el perfil y eliminar los cuellos de botella. Utiliza las mismas herramientas que utilizaría en C#: p. Ej. .Net reflector y un perfilador.
Dicho esto, vale la pena tener en cuenta algunas construcciones de alta productividad en F # que disminuyen el rendimiento. En mi experiencia he visto los siguientes casos:
referencias (frente a las variables de instancia de clase), sólo en código ejecutado mil millones de veces
F # de comparación (= <) vs. System.Collections. Generic.Comparer, por ejemplo, en búsqueda binaria u ordenar
llamadas de cola - solo en ciertos casos que no pueden ser optimizados por el compilador o el tiempo de ejecución .Net. Como se señala en los comentarios, depende del tiempo de ejecución de .Net.
Las secuencias F # son dos veces más lentas que LINQ. Esto se debe a las referencias y al uso de funciones en la biblioteca F # para implementar la traducción de la secuencia < _>. Esto es fácilmente reparable, ya que puede reemplazar el módulo Seq por uno con las mismas firmas que usa Linq, PLinq o DryadLinq.
Tuples, F # tuple es una clase ordenada en el montón. En algunos casos, p. a int * int tuple podría serle útil usar una estructura.
Distribuciones, vale la pena recordar que un cierre es una clase creada con el nuevo operador, que recuerda las variables accedidas. Podría valer la pena "levantar" el cierre o reemplazarlo con una función que tome explícitamente las variables accedidas como argumentos.
Pruebe usar en línea para mejorar el rendimiento, especialmente para el código genérico.
Mi experiencia consiste en codificar primero en F # y optimizar solo las partes importantes. En ciertos casos, podría ser más fácil escribir las funciones lentas en C# en lugar de intentar ajustar F #. Sin embargo, desde el punto de vista de la eficiencia del programador, tiene sentido comenzar/prototipar en F #, luego perfilar, desmontar y optimizar.
En pocas palabras, su código F # podría terminar más lento que C# debido a las decisiones de diseño del programa, pero en última instancia puede obtenerse la eficiencia.
Puntos interesantes, pero necesitaría verificar más de un solo tiempo de ejecución; con CLI 2, x86 y x64 tenían una cola muy diferente; obviamente se ha reforzado en parte debido al soporte de F #, pero esto puede sesgar los perfiles de C#. –
"Esto generalmente requerirá codificación en estilo orientado a objetos imperativo o mutable". No, quieres una mutación para el rendimiento, pero debes * evitar * el estilo orientado a objetos a favor del estilo Fortran. OOP también es lento ... –
Si realmente necesitan velocidad, creo que deberían considerar el lenguaje ensamblador sobre cualquier cosa. –
- 1. Comparación de rendimiento de bucle de datos
- 2. Comparación de rendimiento de int y entero
- 3. Comparación de rendimiento de Winforms y WPF
- 4. Rendimiento de comparación de cadenas en C#
- 5. Comparación de rendimiento de Derby vs PostgreSql
- 6. manipulaciones de jQuery DOM: ¿comparación de rendimiento?
- 7. Comparación de rendimiento de matriz de matrices vs matrices multidimensionales
- 8. Comparación de rendimiento de las agrupaciones de conexiones JDBC
- 9. boost vs ACE C++ Comparación de rendimiento de plataforma cruzada?
- 10. Comparación de rendimiento y usabilidad de las bibliotecas Android JSON
- 11. entidad de doctrina eliminar vs eliminar consulta, comparación de rendimiento
- 12. Comparación de rendimiento de Thrift, Protocol Buffers, JSON, EJB, otro?
- 13. Objetos CF vs objetos NS
- 14. BIGINT rendimiento de mysql en comparación con INT
- 15. ¿Rendimiento de C++/CLI en comparación con Native C++?
- 16. Hashmap vs Bundle en Android Comparación de eficacia y rendimiento
- 17. Java Virtual Machines (JVM) y su comparación de rendimiento
- 18. comparación de rendimiento entre Zend Lucene y Java Lucene
- 19. Rendimiento lento de Amazon SQS en comparación con RabbitMQ
- 20. Sql Server int vs comparación nvarchar en el rendimiento?
- 21. Numpy/Python con un rendimiento terrible en comparación con Matlab
- 22. Regex en java y su rendimiento en comparación con indexOf
- 23. GC.SuppressFinalize el rendimiento en comparación con el objeto no finalizable
- 24. onApplicationEnd - ¿Se está cerrando CF realmente?
- 25. BinaryFormatter no existe en CF. Soluciones?
- 26. ¿Puede Entity Framework CF almacenar valores de 'tipo de objeto'?
- 27. ¿Qué puedo usar en .NET CF como reemplazo de HttpUtility.UrlEncode
- 28. EF 4.1 RC de muchos a muchos en EF CF
- 29. Detección de conexión USB - C# .Net CF 3.5
- 30. Comparación de rendimiento de MemCached con almacenamiento en memoria caché de disco
Lo contrario también es cierto si se beneficia de características exclusivas de F #, como 'en línea '. –