C# / F# Performance comparison

后端 未结 3 988
天涯浪人
天涯浪人 2020-11-28 23:28

Is there any C#/F# performance comparison available on web to show proper usage of new F# language?

相关标签:
3条回答
  • 2020-11-29 00:14

    Natural F# code (e.g. functional/immutable) is slower than natural (imperative/mutable object-oriented) C# code. However, this kind of F# is much shorter than usual C# code. Obviously, there is a trade-off.

    On the other hand, you can, in most cases, achieve performance of F# code equal to performance of C# code. This will usually require coding in imperative or mutable object-oriented style, profile and remove bottlenecks. You use that same tools that you would otherwise use in C#: e.g. .Net reflector and a profiler.

    That having said, it pays to be aware of some high-productivity constructs in F# that decrease performance. In my experience I have seen the following cases:

    • references (vs. class instance variables), only in code executed billions of times

    • F# comparison (<=) vs. System.Collections.Generic.Comparer, for example in binary search or sort

    • tail calls -- only in certain cases that cannot be optimized by the compiler or .Net runtime. As noted in the comments, depends on the .Net runtime.

    • F# sequences are twice slower than LINQ. This is due to references and the use of functions in F# library to implement translation of seq<_>. This is easily fixable, as you might replace the Seq module, by one with same signatures that uses Linq, PLinq or DryadLinq.

    • Tuples, F# tuple is a class sorted on the heap. In some case, e.g. a int*int tuple it might pay to use a struct.

    • Allocations, it's worth remembering that a closure is a class, created with the new operator, which remembers the accessed variables. It might be worth to "lift" the closure out, or replaced it with a function that explicitly takes the accessed variables as arguments.

    • Try using inline to improve performance, especially for generic code.

    My experience is to code in F# first and optimize only the parts that matter. In certain cases, it might be easier to write the slow functions in C# rather that to try to tweak F#. However, from programmer efficiency point of view makes sense to start/prototype in F# then profile, disassemble and optimize.

    Bottom line is, your F# code might end-up slower than C# because of program design decisions, but ultimately efficiency can be obtained.

    0 讨论(0)
  • 2020-11-29 00:23

    Here are a few links on (or related to) this topic:

    • 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/

    What I seem to remember from another post on Robert Pickering's blog (or was it Scott Hanselman?) that in the end, because both are sitting on the same framework, you can get the same performance from both, but you sometimes have to 'twist' the natural expression of the language to do so. In the example I recall, he had to twist F# to get comparable performance with C#...

    0 讨论(0)
  • 2020-11-29 00:24

    See these questions that I asked recently:

    • Is a program F# any more efficient (execution-wise) than C#?
    • How can I use functional programming in the real world?
    • Is it possible that F# will be optimized more than other .Net languages in the future?
    0 讨论(0)
提交回复
热议问题