There seems to be some discussion about Mono's performance, and I wanted to address that.
The default configuration for Mono is a blend of fast startup, and decent code speed. You can tune these parameters depending on your use profile which can range all the way from: startup is the most important factor to high performing code at any cost.
In general the language Shootout compares the default configuration of Mono vs all kinds of other configurations.
Those interested in Mono for High Performance Computing will be interested in some options:
* LLVM: passing the --llvm flag to Mono instructs Mono to pass the code to the LLVM optimizing compiler, and will run your program through every heavy weight optimization that LLVM supports. This comes at the price of slow startup times (much slower), but for HPC or server loads, the extra time it takes to JIT is worth it.
* Unsafe mode. If you have battle tested your application and you never get an IndexOutOfRange exception, you can instruct Mono to never perform array-bounds checking. Arrays bounds checking basically ensures that every time you do array [i] that the value of "i" is within the range 0..array.Length. This can be expensive, but makes your program safe.
Passing -O=unsafe basically gives you the same semantics of C or C++: you know what you are doing, and you really are not too much into safety.
With LLVM + unsafe access, as far as the LLVM optimizer is concerned, there is really no difference between C# and C++ code, and you will get the same performance for compute intensive tasks. The only case where the dynamic of performance would come into play is when the garbage collector kicks-in, vs manual memory management. That in general depends a lot on the kind of app you are building. Many HPC applications preallocate all of their memory before large computations anyways, so in those apps the GC makes no difference.
The third optimization is to use Mono's new garbage collector, which gives in general a nice 2x performance boost to memory intensive applications. In general, the new GC is great for memory intensive applications, while the old one is better for pure computational applications that are not memory allocation bound.
With Mono 3.0, we also have implemented the inlining attribute (new in NET 4.5), which developers can use to force a function to be inlined, something that before was entirely based on JIT heuristics.
And of course, you can tune the individual Mono or LLVM optimization options.
“But even if Microsoft started to deemphasize .NET, I believe .NET would endure because the community will continue to fill in the gaps so that the ecosystem abides.”
Is .NET really that great a platform that these OSS devs will continue to support and improve it after it's been abandoned by Microsoft?
Not saying that's going to happen—but as a .NET dev myself, I'm curious. If it did go that way, I think my only motivation to continue using .NET would be that I don't want to rewrite years worth of code.
C# the language itself is quite nice, probably one of the best mainstream languages out there. I don't really care tho if it would run on the JVM or native (or something else) instead of the CLR.
Right now tho probably the only popular use of non-ms .net (mono) is Unity (which is btw a pretty big deal in the games industry).
If Microsoft were to abandon .Net then I'm pretty sure the motives for maintaining Mono would slip as well.
However I think that is extremely unlikely, no doubt it will be evolved in that annoying Microsoft way but completely abandoning it would make no sense at all.
When I evaluated .Net for my database client I saw a nonportable Java. When I was working on a structural mechanics code I had performance considerations that were not met. The former niche of .Net was that it could painlessness interface with Microsoft technologies, without MS's love, support and their technology why would anybody use .Net?
C# gives you a better Java. Not all improvements have to be revolutionary; downthread you mention Scala but I think its implicits are too powerful for it to be a safe language. (Generally I find the only appropriate use for implicits is extension methods, which C# supports directly and more naturally).
The big promise of .net, though, is better cross-language integration. Scala is in some sense compatible with Java, but a lot of the library is different (e.g. collections); in practice interop is full of awkward edge cases. F#/C# should behave better, though I haven't used them enough to say how true this is in practice.
First, it's very portable.
Second, performance is as good or better than pretty much anything else that is not optimized C or C++.
Finally, there are many reasons to love C# beyond interfacing with MS technology. It's a very beautiful language, much nicer than Java used to be and in many respects better than even the latest Java language. And innovation continues: If you've worked with node.js for some time, you will see how ugly code becomes where everything is done using callbacks. C# just now introduced new syntax where you can basically write code in a linear way and the nesting of callbacks is done by the compiler.
"There’s also this perception that with Windows 8, the Windows team is trying its best to relegate .NET into the dustbin of legacy platforms"
I haven't heard that anywhere. They are tightening the APIs for security and there is the usual rebranding (Silverlight apparently is out) together with the addition of 'our new things are brilliant, unlike the things that we, lasy year, called our new brilliant things', but AFAIK, Microsoft bet and is still betting heavily on .NET.
The Windows team made a huge investment in HTML & Javascript. You could even say they bet on developers using that over XAML/C#.
Looking at the apps in the Store though, and talking to insiders, and the picture is clear that over 80% of the apps in the Windows 8 Store now are XAML/C#. I've been tracking this for the last few months, and the trend is continuing.
People are looking at shifts and trying to find trends. It used to be that the trend was towards ever-growing prominence of .NET. With recent shifts, .NET is still present, but other technologies are now filling roles that .NET had been expected to fill, under the previous trend. This suggests a new trend.
Xamarin appear to be pushing big time the cross platform abilities of C# now. It is possible to have your business logic shared between Windows desktop, WinRT, iOS, Android, web apps etc, with a thin native UI layer on top.
You need to add IF you're using visual studio to that sentence.
This is currently not possible using mono develop; the portable library support doesn't exist, which means your 'shared' libraries can't do things like use sqlite or linq; in fact, they can't have references to anything other than other portable libraries at all. Like, for example, system.collections.generic.
What it would take for me to consider .NET/C# more often, is easier interop with C. I really like the way Golang does it, I know P/Invoke isn't terribly hard, but it's still messy and you have to muck around with attributes and annotations. In Golang I did some interop by simply pasting lines and names of header files around. That's a lot more convenient than having to decide how to layout a struct, at least that was my impression when I looked into it.
Mono documentation is very sparse as well, they basically tell you to just look for the msdn docs, which splits your efforts up and makes you uneasy whether you'll run into Mono specific things. (which there are)
You raise a good point: is there something like http://pinvoke.net/ for non-windows interop? I know that mono is wrapping things themselves, but on open wiki might help.
This is one of the areas that open-source shines: when a core technology that has a passionate following is no longer supported, that passionate following can take on the project themselves and continue.
.Net not equals C#.
C# is great, but .Net sucks.
limited ecosystem, no one want to implement good open soure project on .net stack. no similar level project like JBoss.
Anyone who bought into Microsoft's Proprietary .Net platform deserves what's happening to them now. Anyone who buys into Microsoft's Windows 8, Windows RT, Windows Phone 8 ninsense is just plain braindead.
I'm not sure how you got this from that post, if anything the future has never looked brighter for .NET/C# developers. The ability to target all mainstream platforms, a burgeoning open source community, and fantastic tools. Of course, other technologies have had these in one way or another ... but that doesn't invalidate the C# communities advancements.
The fact is that as a C# developer currently focusing on mobile development, I am very happy these days.
[+] [-] migueldeicaza|13 years ago|reply
The default configuration for Mono is a blend of fast startup, and decent code speed. You can tune these parameters depending on your use profile which can range all the way from: startup is the most important factor to high performing code at any cost.
In general the language Shootout compares the default configuration of Mono vs all kinds of other configurations.
Those interested in Mono for High Performance Computing will be interested in some options:
* LLVM: passing the --llvm flag to Mono instructs Mono to pass the code to the LLVM optimizing compiler, and will run your program through every heavy weight optimization that LLVM supports. This comes at the price of slow startup times (much slower), but for HPC or server loads, the extra time it takes to JIT is worth it.
* Unsafe mode. If you have battle tested your application and you never get an IndexOutOfRange exception, you can instruct Mono to never perform array-bounds checking. Arrays bounds checking basically ensures that every time you do array [i] that the value of "i" is within the range 0..array.Length. This can be expensive, but makes your program safe.
Passing -O=unsafe basically gives you the same semantics of C or C++: you know what you are doing, and you really are not too much into safety.
With LLVM + unsafe access, as far as the LLVM optimizer is concerned, there is really no difference between C# and C++ code, and you will get the same performance for compute intensive tasks. The only case where the dynamic of performance would come into play is when the garbage collector kicks-in, vs manual memory management. That in general depends a lot on the kind of app you are building. Many HPC applications preallocate all of their memory before large computations anyways, so in those apps the GC makes no difference.
The third optimization is to use Mono's new garbage collector, which gives in general a nice 2x performance boost to memory intensive applications. In general, the new GC is great for memory intensive applications, while the old one is better for pure computational applications that are not memory allocation bound.
With Mono 3.0, we also have implemented the inlining attribute (new in NET 4.5), which developers can use to force a function to be inlined, something that before was entirely based on JIT heuristics.
And of course, you can tune the individual Mono or LLVM optimization options.
[+] [-] igouy|13 years ago|reply
[deleted]
[+] [-] lucajona|13 years ago|reply
Is .NET really that great a platform that these OSS devs will continue to support and improve it after it's been abandoned by Microsoft?
Not saying that's going to happen—but as a .NET dev myself, I'm curious. If it did go that way, I think my only motivation to continue using .NET would be that I don't want to rewrite years worth of code.
[+] [-] ido|13 years ago|reply
Right now tho probably the only popular use of non-ms .net (mono) is Unity (which is btw a pretty big deal in the games industry).
[+] [-] tonyedgecombe|13 years ago|reply
However I think that is extremely unlikely, no doubt it will be evolved in that annoying Microsoft way but completely abandoning it would make no sense at all.
[+] [-] drhowarddrfine|13 years ago|reply
[deleted]
[+] [-] frozenport|13 years ago|reply
[+] [-] lmm|13 years ago|reply
The big promise of .net, though, is better cross-language integration. Scala is in some sense compatible with Java, but a lot of the library is different (e.g. collections); in practice interop is full of awkward edge cases. F#/C# should behave better, though I haven't used them enough to say how true this is in practice.
[+] [-] quonn|13 years ago|reply
[+] [-] mattchew|13 years ago|reply
[+] [-] rocky1138|13 years ago|reply
If you need to get a prototype up and running quickly, you can do that with a minimum of fuss. Plus, C# is actually a pretty solid language.
[+] [-] Someone|13 years ago|reply
I haven't heard that anywhere. They are tightening the APIs for security and there is the usual rebranding (Silverlight apparently is out) together with the addition of 'our new things are brilliant, unlike the things that we, lasy year, called our new brilliant things', but AFAIK, Microsoft bet and is still betting heavily on .NET.
Anybody know what this statement is based on?
[+] [-] cek|13 years ago|reply
Looking at the apps in the Store though, and talking to insiders, and the picture is clear that over 80% of the apps in the Windows 8 Store now are XAML/C#. I've been tracking this for the last few months, and the trend is continuing.
[+] [-] cliffbean|13 years ago|reply
[+] [-] edandersen|13 years ago|reply
[+] [-] shadowmint|13 years ago|reply
This is currently not possible using mono develop; the portable library support doesn't exist, which means your 'shared' libraries can't do things like use sqlite or linq; in fact, they can't have references to anything other than other portable libraries at all. Like, for example, system.collections.generic.
[+] [-] Meai|13 years ago|reply
[+] [-] jstclair|13 years ago|reply
[+] [-] lucajona|13 years ago|reply
[+] [-] rocky1138|13 years ago|reply
[+] [-] jiupai|13 years ago|reply
[+] [-] migueldeicaza|13 years ago|reply
There is a whole new set of framrworks for building web applications. My favorite frameworks include:
* ServiceStack: everything you need to build sophisticated web apps with a clean, beautiful API.
* WebAPI: if you want to get a more "Enterprisey" set of APIs
* ASP.NET MVC: .NET's approach to Ruby-on-Rails-esque development.
* SignalR: real-time web applications.
[+] [-] awaretek|13 years ago|reply
But some people never learn :-)
[+] [-] CodeCube|13 years ago|reply
The fact is that as a C# developer currently focusing on mobile development, I am very happy these days.
[+] [-] unknown|13 years ago|reply
[deleted]
[+] [-] f1f2f3|13 years ago|reply