Mono and Mac

So recently I left the world of Desktop PCs (at home at least) and bought myself a luscious 15″ Retina Macbook Pro. The 2nd thing I installed was Mono (the 1st was Windows 7 natch!).

Why a Mac?

I’ve been using Windows since Windows 95 and had every home version of the OS since – including ME and Vista. And I’ve enjoyed them all. Windows 8 has changed that (although I technically own a licence to that too – what can I say – I’m a sucker). Theres no way I can stick with that OS for the next 4 years…….

The sounds from Microsoft are clear – .NET is second class. You want performance – use C++. You want productivity – use HTML+JS. Anders recent focus on the Javascript++, sorry Typescript, and MS failing to promote F# adequately (not the F# team, who promote anything and everything relevant about F# – the rest of MS seem to want to keep it quiet it feels like) – probably as it’s developed in Cambridge (UK) and not back in the US, so isn’t very well understood.

Add into the mix my 1 year old son, whose fascination with my desktop PC and swinging from its DVD drives, and the space it takes which is far more useful as toy storage –  a new laptop was in order.

Apple was immediately in the running. 2880×1800 was why. Nothing else. I’d buy that. My iPad 3 screen was stunning – imaging writing code on a screen that nice. I hesitated though. As a long time Windows user I spent a long time looking for a high spec Dell or HP or anything that could come close. Every time I managed to spec something close a weird thing happened – it was more expensive than the Macbook Pro Retina. At least on a Mac I could install Windows and have MacOS as a second OS.

I caved in last month (Christmas coming and that desk space was reserved for a brand new trike). I really wanted to give MacOS a shot tho, so I installed Mono and MonoDevelop straight away.

Piversion

Mono on a Mac wasn’t my first shot at using Mono. I also bought myself a Raspberry Pi this year.

A 700Mhz ARM CPU and 256Mb RAM for £25 was simply too tempting. I had to have one. On release there were no OSes to support its hardware floating point unit so all software used software floating point emulation – on an already slow 700Mhz CPU it was painful. But (for fun) I ran a Raytracer I’d written in F# on it to see how it compared to my home Q6600 and my work’s i7. More on the result later.

Back to Mac

So that same Raytracer I ran on the Windows part of my Mac. A simple scene at 1280×720 – 2 spheres and a plane with 3 lights. No fancy features – just ray hits surface, ray reflects, recurse. It ran in < 1 second. 1.5 times faster than my work i7 and 2.5 times faster than my Q6600 it was replacing.

Booting in MacOS I re-ran the test in Mono. 5 minutes 30 seconds. Around 330 times slower than the same exe on the same hardware. Just the OS and the runtime differed.

My heart sank. I love F#. I love C# (less). I didn’t buy a Mac to do Objective-C. I just wanted decent hardware to write .NET flavoured code on. And I sort of wanted the OS to be MacOS. I’d just assumed that Mono would be fast enough on such sweet hardware.

Oh and by the way – that same exe running in software on a Raspberry Pi on Mono – 10 minutes. Only half the speed of the 2.6Ghz i7 with 16GB of RAM. My dream of ditching out of Windows and using Mono on Mac was starting to look a lot like it was a really poor choice. I started thinking I’d have been better off buying 2 Pi’s and saving the best part of 2 and a half grand.

Social (In)etiquette

So I tweeted this:

“F# Raytracer on Win7 MBPr – ~1sec Under Mono on MacOS – 5:30. Minutes. 330 times slower on exact same hardware. Boo!”

I hadn’t hash-tagged it or aimed it at anyone. It was my attempt to cry about a sufficiently large duff purchase to my 50 or so followers (for them to ignore). But someone read it and added Miguel De Icaza to a retweet. Suddenly I started getting tweets from Miguel asking for code snippets and samples.

At this point I kinda felt like I’d hurt his feelings – his tweets sounded that way. After a quick round of tweets he reveals that Mono 3 defaults to the old garbage collector and that if I used the new garbage collector I’d get speeds *much* closer to .NET. I already knew I had GC issues on .NET – the profiler in VS2012 told me I had a large number of collections – something I worked around on .NET by switching off concurrent GC. Mono’s older GC simply magnified the issue.

I’d simply typed at a terminal

mono RaytracerFSharp.exe

and complained when it didn’t work the way I expected first time. I should have tried more options before venting.

For reference Miguel also tweeted this – clearly aimed at me:

Pro-Tip: If you are using Task Parallel Library or using lots of threads with Mono on OSX, make sure you use SGen, or suffer the pain.

At least I wasn’t going to regret the Mac now, even with egg on my face.

Mono Rocks

It’s not perfect, but it is great. Here’s why:

  1. It exists. Despite everyone saying when it started that MS would shut it down and sue anyone using it – it’s still here.
  2. They care. It’s their whole business. They monetize it with MonoTouch/Droid/Mac. The create the free stuff with it and for it. While it feels like MS are busy firing up the furnaces to throw .NET in, Miguel and his team are planning a daring rescue. And it looks more and more likely that it may work. Even more recent MS castoffs are getting new leases of life on Mono – think XNA/Monogame.
  3. They really care. Had I tweeted that .NET performance sucked would MS have asked for samples? Heck even if you send samples to MS you’re likely to be ignored. If you’re lucky on a public forum you might get a handy tip from a passionate team member, but largely you’re ignored by the masses – except, of course the wonderful F# team who have always been super reactive to my team at work. Miguel answering is almost like Steve Balmer replying to a tweet on a .NET issue.

All Apologies

So apologies to the Mono team for my initially (but also unintentionally) rude tweet. Thanks for the help and the continued work. I’ll continue to use and enjoy it and stop whinging about it.

PS

Any news on making Mono work with HardFP on the Raspberry Pi 🙂

About thedo666

Software developer trying to learn a new language - English!
This entry was posted in C#, F#, Mono. Bookmark the permalink.

7 Responses to Mono and Mac

  1. leeoades says:

    Dude. Enjoyed your post. What was the time for sgen mono?

  2. Interesting post, I must admit Im enjoying using F# with Mono (And MonoGame)

  3. CasiToledo says:

    Did you test SGen with the raspberry pi?
    Whats the time?

    • thedo666 says:

      Sadly the current state on Mono on the pi is poor. Hardware floating point version of Linux (ie raspbian) are hugely faster in general performance but Mono crashes constantly. Software fp is so slow as to be unusable in the older Debian builds.

      Perhaps if the mono team popped some resources on it (like sun have for java on the pi) we could see some results in improving the situation. If you check out the raspberry pi forums you’ll see some interesting chatter on the current state of people building mono on the pi for hard fp.

  4. Pingback: Hosting Websharper/ASP.NET apps on Linux with Mono + nginx | The Code Decanter

  5. jakemdrew says:

    Sgen did not help me out at all. In my own experience, I have a highly parallel program in C# for the learning and classification of gene sequence data which makes very heavy usage of the Task Parallel Library features such as Parallel.ForEach, Parallel.For, Task.Factory.StartNew(), and many structures from from the Collections.Concurrent namespace (Blocking Collections, Concurrent Dictionaries, Concurrent Bags etc). In short, my application’s performance on Linux using mono is many many times slower. I am still trying to figure this out. I can run it from the mono console in windows with similar performance.

    Learning 8,258 sequences: 0:17 vs. 1:59 m:ss on Linux

    Classify 921 sequences: 2.29 seconds vs. 11:05 mm:ss on Linux

    You can see more details and screenshots on my stack overflow post here:

    http://stackoverflow.com/questions/5170846/task-parallel-library-implementation-on-mono/27080880#27080880

Leave a reply to leeoades Cancel reply