To ground your question a little better, do you already have your planning algorithm, and is it implemented in something where it has acceptable performance?
As a general observation, F# may be a great way to prototype your algorithm and also elements of your game system. Access to the .NET libraries, including DirectX and the .NET 3.0 WinFX capabilities should give you a further boost, along with the VS 2005 integration. And, for isolatable performance-critical elements, there are ways to bridge to lower-level custom implementations (in C or C++, and even assembler) without losing your overall flexibility.
If your game will be commercial, one risk to consider will be the absence of commercial support for F#, since it is presently a closed-source research language. I would prototype with it anyhow for the purchase it will give you on rapid confirmation and access to .NET. You should learn quickly enough whether there are barriers that require you to pursue an alternative.
Let me elaborate a bit on the project at hand, as I will be working on the project with initial the poster.
The project is entirely academic, and we currently have no implementation of the planner. Potential uses for the planner are planning in an FPS (UT2004 with the GameBots extension), and possibly Lego Mindstorm Robots (both of which have libraries written/being written in C#).
Reading the response (thanks all!), it seems like F# is a great candidate with regards to performance. Unless any serious issues arise, I think F# will be our initial language of choice.
On performance, yes, absolutely go with F# !!
F# and C# both compile to IL code, so you can often get F# and C# code to run at comparable speeds.
Here are a couple of perf. tips:
a) Avoid using exceptions for control flow (.NET exceptions are costly).
b) If you use local state, note that local mutables will be represented as method locals, so are preferable to local reference cells.
c) Use .NET 2.0 which has generics (for fast polymorphic code).
You mention games, what is your target platform? PC? CompactFramework? XBox?
@jamarg: Why would you say F# for speed? Any proof of that or why it's faster then C#?
I'm simply curious
I think jamarg said "comparable." My sense from the analysis that was posted somewhere is that there is a modest F# penalty (around 10-15%) and that may change as the compiler is improved and as people learn the best idioms for clean F#. Choice of good algorithmic approaches can provide far more benefit than changing to a more verbose language for development and maintenance.
The fact that F# allows one to work easily at higher functional+object levels of abstraction is the important advantage, I'd say, especially during early development. That it is always compiled is the second benefit, along with the nice handling of types.
Finally, the more that an F# applications relies on the Common Language Infrastructure and uses well-crafted components from other sources, the less important the F# overhead will be.
Where that economy of F# usage appeals to me is that I can avoid premature optimization and then, after I know where the pain is, only optimize where it is necessary and does the most good.
There is no intrinsic performance penalty for F# code vis a vis C# code - if we entered F# in a language shootout (anyone care to do that?) I reckon we'd be on par, without contorting the F# code. Certain constructs in both C# and F# are cheap, e.g. generic data structures using floating point numbers are unboxed. The use of certain constructs imposes micro costs, e.g. an indirect call to a function value is cheap, but not as cheap as a direct call. The same story can be repeated for constructs in both languages. F# uses peep-hole and inlining optimizations to eliminate these costs when the information is there to do so.
That's performance of code and memory use. Macro-performance is another game, where what Dennis (orcmid) says is spot on: this involves techniques such as:
- good choices of data structures (yes, arrays are better than F# lists in some cases [:)])
- good choices of algorithms
- avoiding premature optimization
- rapid prototyping with F# Interactive
- dynamic investigation of object graphs using F# Interactive (e.g. see the TermWalker sample - I've been using a modified version of this recently to analyze the memory usage of the F# compiler)
- the use of tools such as CPU and memory profilers
- the use of native code in exceptional circumstances (e.g. the Intel MKL or the AMD ACML)
- the use of multiple CPUs and clusters
- the correct use of well-engineered efficient I/O, database, networking and graphics libraries
In some cases the aim is simply to make sure your computation is bounded by some other computing resource than CPU, e.g. the systems group at MSR Cambridge have been happy to code in F# rather than Python since "now we're disk bound". In general, .NET languages excel at creating high-performance applications that involve a number of computing resources, but the added value of the succinct language and F# Interactive make F# particularly strong in this regard.
One exception on the code/memory front is that F# code does not support the authoring of structs. This is a useful tool for improving memory use, though can easily be abused. This is something we plan to address.
Finally, I would expect a fully productized version of F# (should it ever happen [:)]) to include a whole assembly optimizing compiler (ala MLton and SML.NET, but whole-assembly, not whole-program). This is well known to give useful additional performance gains for some programs in this class of languages. But that's just plans.[;)]
Don
Is this still in the plans? ;)
Finally, I would expect a fully productized version of F# (should it ever happen [:)]) to include a whole assembly optimizing compiler (ala MLton and SML.NET, but whole-assembly, not whole-program). This is well known to give useful additional performance gains for some programs in this class of languages. But that's just plans.[;)]
Don
Mark asked @jamarg:
> Why would you say F# for speed?
> Any proof of that or why it's faster then C#?
> I'm simply curious.
In 2005, using some shootout benchmarks, I did performance comparisons including F#, C# and C++. The timings were done on .NET 2.0 (which was still in beta back then).
I found that F# and C# had comparable speeds, which is to be expected, since both compile to IL code and should produce good enough IL code for the JIT. Since those tests there have been various improvements to the IL code generated from F#, e.g. reduced locals, enabling loop bound optimisations etc..
The basic timings are included below.
The micro benchmarks were focused on numerical calculations. I've found that .NET does very well on such calculations. Combine that performance with the clarity you can get writing such code in an ML-like language then you begin to see why people get so excited when they "discover" it!
James.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
---x---x---x---x---x---x---x---x---x---x---x---x---x---x---x---x---x---x--- C:\perftalk>utime nbody-cpp-win32-p4.exe 5000000 real: 0:00:03.249 user: 0:00:03.234 sys: 0:00:00.000 C:\perftalk>utime nbody-cs-win32-p4.exe 5000000 real: 0:00:03.140 user: 0:00:03.031 sys: 0:00:00.000 C:\perftalk>utime nbody-fsc20b2-win32-p4.exe 5000000 real: 0:00:03.859 user: 0:00:03.765 sys: 0:00:00.078 ---x---x---x---x---x---x---x---x---x---x---x---x---x---x---x---x---x---x--- C:\perftalk>utime harmonic-cpp-win32-p4.exe 200000000 real: 0:00:03.312 user: 0:00:03.312 sys: 0:00:00.015 C:\perftalk>utime harmonic-cs-win32-p4.exe 200000000 real: 0:00:03.390 user: 0:00:03.312 sys: 0:00:00.031 C:\perftalk>utime harmonic-fsc20b2-win32-p4.exe 200000000 real: 0:00:03.406 user: 0:00:03.375 sys: 0:00:00.031 ---x---x---x---x---x---x---x---x---x---x---x---x---x---x---x---x---x---x--- c:\perftalk>utime spectral-cpp-win32-p4.exe 2000 real: 0:00:03.843 user: 0:00:03.812 sys: 0:00:00.000 c:\perftalk>utime spectral-cs-win32-p4.exe 2000 real: 0:00:02.734 user: 0:00:02.656 sys: 0:00:00.031 c:\perftalk>utime spectral-fsc20b2-win32-p4.exe 2000 real: 0:00:02.765 user: 0:00:02.703 sys: 0:00:00.046 ---x---x---x---x---x---x---x---x---x---x---x---x---x---x---x---x---x---x---
PS. Remember threads...
.NET is multi-threaded, making use of hardware when available, e.g. dual-processor, or dual-core, or hyper-threading. If your planning can be split into disjoint search tasks, then you could make significant gains if your hardware supports it.
[based on recent tests computing fractals].
Topic tags
- f# × 3705
- websharper × 1897
- compiler × 286
- functional × 201
- ui next × 139
- c# × 121
- classes × 97
- web × 97
- .net × 84
- book × 84
- async × 76
- ui.next × 67
- bug × 54
- core × 49
- website × 49
- server × 45
- parallel × 43
- ui × 43
- enhancement × 41
- parsing × 41
- testing × 41
- trywebsharper × 41
- typescript × 37
- html × 35
- javascript × 35
- owin × 35
- asynchronous × 30
- monad × 28
- ocaml × 28
- tutorial × 27
- warp × 27
- haskell × 26
- sitelet × 25
- linq × 22
- workflows × 22
- wpf × 20
- fpish × 19
- introduction × 19
- silverlight × 19
- sitelets × 19
- monodevelop × 17
- rpc × 17
- suave × 17
- piglets × 16
- collections × 15
- feature request × 15
- jquery × 15
- templates × 15
- getting started × 14
- pipeline × 14
- kendoui × 13
- reactive × 12
- 4.1.0.171 × 11
- monads × 11
- opinion × 10
- 4.0.190.100-rc × 9
- deployment × 9
- fixed × 9
- formlets × 9
- in × 9
- json × 9
- plugin × 9
- proposal × 9
- scheme × 9
- solid × 9
- basics × 8
- concurrent × 8
- highcharts × 8
- how-to × 8
- python × 8
- 4.1.1.175 × 7
- complexity × 7
- documentation × 7
- visual studio × 7
- 4.1.2.178 × 6
- lisp × 6
- real-world × 6
- released in 4.0.192.103-rc × 6
- remoting × 6
- resources × 6
- scala × 6
- websharper ui.next × 6
- workshop × 6
- xaml × 6
- 4.0.193.110 × 5
- 4.2.3.236 × 5
- aspnetmvc × 5
- authentication × 5
- azure × 5
- bootstrap × 5
- conference × 5
- dsl × 5
- formlet × 5
- java × 5
- list × 5
- metaprogramming × 5
- ml × 5
- released in Zafir.4.0.188.91-beta10 × 5
- sql × 5
- visualstudio × 5
- websharper.forms × 5
- zafir × 5
- 4.0.192.106 × 4
- 4.0.195.127 × 4
- 4.1.0.38 × 4
- 4.2.1.86 × 4
- 4.2.6.118 × 4
- css × 4
- example × 4
- extensions × 4
- fsi × 4
- fsx × 4
- html5 × 4
- jqueryui × 4
- lift × 4
- reflection × 4
- remote × 4
- rest × 4
- spa × 4
- teaching × 4
- template × 4
- websocket × 4
- wontfix × 4
- 4.0.196.147 × 3
- 4.1.0.34 × 3
- 4.1.6.207 × 3
- 4.2.1.223-beta × 3
- 4.2.11.258 × 3
- 4.2.4.114 × 3
- 4.2.4.247 × 3
- 4.2.5.115 × 3
- 4.2.6.253 × 3
- 4.2.9.256 × 3
- ajax × 3
- alt.net × 3
- aml × 3
- asp.net mvc × 3
- canvas × 3
- cloudsharper × 3
- compilation × 3
- database × 3
- erlang × 3
- events × 3
- extension × 3
- file upload × 3
- forums × 3
- inline × 3
- issue × 3
- kendo × 3
- macro × 3
- mono × 3
- msbuild × 3
- mvc × 3
- pattern × 3
- piglet × 3
- released in Zafir.4.0.187.90-beta10 × 3
- svg × 3
- type provider × 3
- view × 3
- 4.1.1.64 × 2
- 4.1.5.203 × 2
- 4.1.7.232 × 2
- 4.2.10.257 × 2
- 4.2.3.111 × 2
- 4.2.5.249 × 2
- android × 2
- asp.net × 2
- beginner × 2
- blog × 2
- chart × 2
- client × 2
- client server app × 2
- clojure × 2
- computation expressions × 2
- constructor × 2
- corporate × 2
- courses × 2
- cufp × 2
- d3 × 2
- debugging × 2
- direct × 2
- discriminated union × 2
- docs × 2
- elm × 2
- endpoint × 2
- endpoints × 2
- enterprise × 2
- entity framework × 2
- event × 2
- f# interactive × 2
- fable × 2
- flowlet × 2
- formdata × 2
- forms × 2
- fsc × 2
- google maps × 2
- hosting × 2
- http × 2
- https × 2
- iis 8.0 × 2
- install × 2
- interactive × 2
- interface × 2
- iphone × 2
- iteratee × 2
- jobs × 2
- jquery mobile × 2
- keynote × 2
- lens × 2
- lenses × 2
- linux × 2
- listmodel × 2
- mac × 2
- numeric × 2
- oauth × 2
- obfuscation × 2
- offline × 2
- oop × 2
- osx × 2
- packaging × 2
- pattern matching × 2
- performance × 2
- pipelines × 2
- q&a × 2
- quotation × 2
- reference × 2
- released in Zafir.4.0.185.88-beta10 × 2
- rx × 2
- script × 2
- security × 2
- self host × 2
- seq × 2
- sockets × 2
- stm × 2
- tcp × 2
- trie × 2
- tutorials × 2
- type × 2
- url × 2
- var × 2
- websharper.charting × 2
- websharper4 × 2
- websockets × 2
- wig × 2
- xna × 2
- zh × 2
- .net interop × 1
- 2012 × 1
- 4.0.194.126 × 1
- 4.1.3.184 × 1
- 4.1.4.189 × 1
- 4.2.0.214-beta × 1
- 4.2.12.259 × 1
- 4.2.2.231-beta × 1
- 4.2.8.255 × 1
- Canvas Sample Example × 1
- DynamicStyle Animated Style × 1
- Fixed in 4.0.190.100-rc × 1
- Released in Zafir.UI.Next.4.0.169.79-beta10 × 1
- SvgDynamicAttribute × 1
- WebComponent × 1
- abstract class × 1
- accumulator × 1
- active pattern × 1
- actor × 1
- addin × 1
- agents × 1
- aggregation × 1
- agile × 1
- alter session × 1
- animation × 1
- anonymous object × 1
- apache × 1
- api × 1
- appcelerator × 1
- architecture × 1
- array × 1
- arrays × 1
- asp.net 4.5 × 1
- asp.net core × 1
- asp.net integration × 1
- asp.net mvc 4 × 1
- asp.net web api × 1
- aspnet × 1
- ast × 1
- attributes × 1
- authorization × 1
- b-tree × 1
- back button × 1
- badimageformatexception × 1
- bash script × 1
- batching × 1
- binding-vars × 1
- bistro × 1
- body × 1
- bundle × 1
- camtasia studio × 1
- cas protocol × 1
- charts × 1
- clarity × 1
- class × 1
- cli × 1
- clipboard × 1
- clojurescript × 1
- closures × 1
- cloud × 1
- cms × 1
- coding diacritics × 1
- color highlighting × 1
- color zones × 1
- combinator × 1
- combinators × 1
- compile × 1
- compile code on server × 1
- config × 1
- confirm × 1
- content × 1
- context × 1
- context.usersession × 1
- continuation-passing style × 1
- coords × 1
- cordova × 1
- cors × 1
- coursera × 1
- cross-domain × 1
- csla × 1
- current_schema × 1
- custom content × 1
- data × 1
- data grid × 1
- datetime × 1
- debug × 1
- declarative × 1
- delete × 1
- devexpress × 1
- dhtmlx × 1
- dictionary × 1
- directattribute × 1
- disqus × 1
- distance × 1
- do binding × 1
- doc elt ui.next upgrade × 1
- docker × 1
- dojo × 1
- dol × 1
- dom × 1
- domain × 1
- du × 1
- duf-101 × 1
- dynamic × 1
- eastern language × 1
- eclipse × 1
- edsl × 1
- em algorithm × 1
- emacs × 1
- emotion × 1
- enums × 1
- error × 1
- etw × 1
- euclidean × 1
- eventhandlerlist × 1
- examples × 1
- ext js × 1
- extension methods × 1
- extra × 1
- facet pattern × 1
- failed to translate × 1
- fake × 1
- fantomas × 1
- fear × 1
- float × 1
- form × 1
- form-data × 1
- forum × 1
- fp × 1
- frank × 1
- fsdoc × 1
- fsharp × 1
- fsharp.core × 1
- fsharp.powerpack × 1
- fsharpx × 1
- fsunit × 1
- function × 1
- functional style × 1
- game × 1
- games × 1
- gc × 1
- generic × 1
- geometry × 1
- getlastwin32error × 1
- getting-started × 1
- google × 1
- google.maps × 1
- grid × 1
- group × 1
- guide × 1
- hash × 1
- headers × 1
- hello world example × 1
- heroku × 1
- highchart × 1
- history × 1
- how to × 1
- html-templating × 1
- http405 × 1
- httpcontext × 1
- hubfs × 1
- i18n × 1
- ie 8 × 1
- if-doc × 1
- iis × 1
- image × 1
- images × 1
- inheritance × 1
- initialize × 1
- input × 1
- install "visual studio" × 1
- installer × 1
- int64 × 1
- interfaces × 1
- internet explorer × 1
- interop × 1
- interpreter × 1
- io × 1
- iobservable × 1
- ios × 1
- iot × 1
- ipad × 1
- isomorphic × 1
- javascript optimization × 1
- javascript semanticui resources × 1
- jquery-plugin × 1
- jquery-ui × 1
- jquery-ui-datepicker × 1
- js × 1
- kendo datasource × 1
- kendochart × 1
- kendoui compiler × 1
- knockout × 1
- l10n × 1
- learning × 1
- library × 1
- libs × 1
- license × 1
- licensing × 1
- lineserieszonescfg × 1
- local setting × 1
- localization × 1
- logging × 1
- loop × 1
- macros × 1
- mailboxprocessor × 1
- mapping × 1
- maps × 1
- markerclusterer × 1
- markup × 1
- marshal × 1
- math × 1
- mathjax × 1
- message × 1
- message passing × 1
- message-passing × 1
- meta × 1
- metro style × 1
- micro orm × 1
- minimum-requirements × 1
- mix × 1
- mobile installation × 1
- mod_mono × 1
- modal × 1
- module × 1
- mouseevent × 1
- mouseposition × 1
- multidimensional × 1
- multiline × 1
- multithreading × 1
- mysql × 1
- mysqlclient × 1
- nancy × 1
- native × 1
- nested × 1
- nested loops × 1
- node × 1
- nunit × 1
- object relation mapper × 1
- object-oriented × 1
- om × 1
- onboarding × 1
- onclick × 1
- optimization × 1
- option × 1
- orm × 1
- os x × 1
- output-path × 1
- override × 1
- paper × 1
- parameter × 1
- persistence × 1
- persistent data structure × 1
- phonegap × 1
- pola × 1
- post × 1
- powerpack × 1
- prefix tree × 1
- principle of least authority × 1
- privacy × 1
- private × 1
- profile × 1
- programming × 1
- project × 1
- project euler × 1
- projekt_feladat × 1
- protected × 1
- provider × 1
- proxy × 1
- ptvs × 1
- public × 1
- pure f# × 1
- purescript × 1
- qna × 1
- quant × 1
- query sitelet × 1
- question × 1
- quotations × 1
- range × 1
- raphael × 1
- razor × 1
- rc × 1
- reactjs × 1
- real-time × 1
- ref × 1
- region × 1
- released in 4.0.190.100-rc × 1
- reporting × 1
- responsive design × 1
- rest api × 1
- rest sitelet × 1
- restful × 1
- round table × 1
- router × 1
- routing × 1
- rpc reverseproxy × 1
- runtime × 1
- sales × 1
- sample × 1
- sampleapp × 1
- scriptcs × 1
- scripting × 1
- search × 1
- self hosted × 1
- semanticui × 1
- sequence × 1
- serialisation × 1
- service × 1
- session-state × 1
- sharepoint × 1
- signals × 1
- sitelet website × 1
- sitelet.protect × 1
- sitlets × 1
- slickgrid × 1
- source code × 1
- sqlentityconnection × 1
- ssl × 1
- standards × 1
- static content × 1
- stickynotes × 1
- streamreader × 1
- stress × 1
- strong name × 1
- structures × 1
- submitbutton × 1
- subscribe × 1
- svg example html5 websharper.ui.next × 1
- sweetalert × 1
- system.datetime × 1
- system.reflection.targetinvocationexception × 1
- table storage × 1
- targets × 1
- tdd × 1
- templates ui.next × 1
- templating × 1
- text parsing × 1
- three.js × 1
- time travel × 1
- tls × 1
- tooltip × 1
- tracing × 1
- tsunamiide × 1
- turkish × 1
- twitter-bootstrap × 1
- type erasure × 1
- type inference × 1
- type providers × 1
- type-providers × 1
- typeprovider × 1
- ui next forms × 1
- ui-next × 1
- ui.next jqueryui × 1
- ui.next charting × 1
- ui.next formlets × 1
- ui.next forms × 1
- ui.next suave visualstudio × 1
- ui.next templating × 1
- unicode × 1
- unittest client × 1
- upload × 1
- usersession × 1
- validation × 1
- vb × 1
- vb.net × 1
- vector × 1
- view.map × 1
- visal studio × 1
- visual f# × 1
- visual studio 11 × 1
- visual studio 2012 × 1
- visual studio shell × 1
- vs2017 compiler zafir × 1
- vsix × 1
- web api × 1
- web-scraping × 1
- webapi × 1
- webcomponents × 1
- webforms × 1
- webgl × 1
- webrtc × 1
- webshaper × 1
- websharper async × 1
- websharper codemirror × 1
- websharper f# google × 1
- websharper forms × 1
- websharper reactive × 1
- websharper rpc × 1
- websharper sitelets routing × 1
- websharper warp × 1
- websharper-interface-generator × 1
- websharper.chartsjs × 1
- websharper.com × 1
- websharper.exe × 1
- websharper.owin × 1
- websharper.ui.next × 1
- websharper.ui.next jquery × 1
- websockets iis × 1
- why-websharper × 1
- windows 7 × 1
- windows 8 × 1
- windows-phone × 1
- winrt × 1
- www.grabbitmedia.com × 1
- xamarin × 1
- xml × 1
- yeoman × 1
- yield × 1
- zafir beta × 1
- zafir websharper4 × 1
- zarovizsga × 1
![]() |
Copyright (c) 2011-2012 IntelliFactory. All rights reserved. Home | Products | Consulting | Trainings | Blogs | Jobs | Contact Us | Terms of Use | Privacy Policy | Cookie Policy |
Built with WebSharper |
I am undertaking a project to implement a planning algorithm. For this purpose I have considered using a functional programming language. The planning algorithm will be used for real-time planning/replanning, eg. in games, and needs to be integrated with a C# library. As such, F# seems like an attractive choice. My primary concern is whether F# offers the performance required for this task. I have no experience with F#, and limited with .NET. Any input would be greatly appreciated.