I like F# ; I really, really do. Having been bitten by the "functional programming"-bug, I force myself to use it when I have the opportunity to. In fact, I recently used it (during a one week vacation) to code a nice AI algorithm.
However, my attempts so far (see a SO question related to my first attempt here) seem to indicate that, though undoubtedly beautiful... F# has the slowest execution speed of all the languages I've used.
Am I doing something wrong in my code?
I verbosely explain what I did in my blog post, and in my experiments, I see OCaml and the rest of the group running anywhere from 5x to 35x faster than F#.
Am I the only one with such experiences? I find it disheartening that the language I like the most, is also the slowest one - sometimes by far...
EDIT: Direct GitHub link, where the code lives in various language forms...
EDIT2: Thanks to Thomas and Daniel, speed improved considerably:
- Greatest speed boost: moving from "ref" to "mutable" gave a whopping 30%.
- Removing exceptions and using while/flagChecks gave another 16%.
- Switching from discriminated unions to enums gave another 5%.
- "inline" gave 0.5-1%
EDIT3: Dr Jon Harrop joined the fight: 60% speedup, by making ScoreBoard operate directly on the "enumerated" version of the data. The imperative version of F# now runs 3-4 times slower than C++, which is a good result for a VM-based runtime. I consider the problem solved - thanks guys!
EDIT4: After merging all optimizations, these are the results (F# reached C# in imperative style - now if only I could do something about functional style, too!)
- real 0m0.221s: That was C++
- real 0m0.676s: That was C# (imperative, C++ mirror)
- real 0m0.704s: That was F# (imperative, C++ mirror)
- real 0m0.753s: That was OCaml (imperative, C++ mirror)
- real 0m0.989s: That was OCaml (functional)
- real 0m1.064s: That was Java (imperative)
- real 0m1.955s: That was F# (functional)