views:

143

answers:

5

Hi guys,

I have a project in which I'll have to process 100s if not 1000s of messages a second and process/plot this data on graphs accordingly (The user will search for a set of data in which the graph will be plotted in real time, not literally having to plot 1000s of values on a graph).

I'm having trouble understanding using dlls for having the bulk of the message processing in C++ but then handing the information into a C# interface. Can someone dumb it down for me here?

Also, as speed will be a priority I was wondering if accessing across 2 different layers of code will have more of a performance hit that programming the project in it's entirety in C# , or certainly C++ though I've read bad things about programming a GUI in C++ in which, this application must also look modern, clean, professional etc. so I was thinking C# would be the way forward (perhaps XAML, wPF)

Thanks for your time.

+3  A: 

If speed is your priority, C++ might be the better choice. Try to make some estimations about how hard the calculation really is (1000 messages can be trivial to handle in C# if the calculation per message is easy, and they can be too hard for even the best optimized program). C++ might have some more advantages (regarding performance) over C# if your algorithms are complex, involving different classes etc.

You might want to take a look at this question for a performance comparison.

Separiting back-end and front-end is a good idea. If you get performance penalty from having one in C++ and C# depends on how much data conversion is actually necessary.

I don't think programming the GUI is a pain in general. MFC might be painful, Qt is not (IMHO).

Maybe this gives you some points to start with!

Philipp
Fantastic work guys, much appreciated on the answer front (If I could upvote I would). As a followon to the above, do you reckon processing over 2000 messages at any one time is also a trivial task for C#? Effectively, I'll be taking each message and parsing it, storing it in a human readable form, then displaying it in a GUI. As far as I can see the parsing and storing will be continuely happening while the certain elements of GUI e.g graphs, tables will display on demand (querying the data / user interaction) Thanks very much for the help!
Sparky
+2  A: 

The simplest way to interop between a C/C++ DLL and a .NET Assembly is through p/invoke. On the C/C++ side, create a DLL as you would any other. On the C# side you create a p/invoke declaration. For example, say your DLL is mydll.dll and it exports a method void Foo():

[DllImport("mydll.dll")]
extern static void Foo();

That's it. You simply call Foo like any other static class method. The hard part is getting data marshalled and that is a complicated subject. If you are writing the DLL you can probably go out of your way to make the export functions easily marshalled. For more on the topic of p/invoke marshalling see here: http://msdn.microsoft.com/en-us/magazine/cc164123.aspx.

You will take a performance hit when using p/invoke. Every time a managed application makes an unmanaged method call, it takes a hit crossing the managed/unmanaged boundary and then back again. When you marshal data, a lot of copying goes on. The copying can be reduced if necessary by using 'unsafe' C# code (using pointers to access unmanaged memory directly).

What you should be aware of is that all .NET applications are chock full of p/invoke calls. No .NET application can avoid making Operating System calls and every OS call has to cross into the unmanaged world of the OS. WinForms and even WPF GUI applications make that journey many hundreds, even thousands of times a second.

If it were my task, I would first do it 100% in C#. I would then profile it and tweak performance as necessary.

Tergiver
It's arguable which is simpler, but C++ interop (by passing /clr to the Visual C++ compiler) is definitely faster than p/invoke.
Ben Voigt
I think I'm starting to sway towards the C# option. I should mention that I'll actually have to *learn* C++ before doing this whereas I know C#. I've been reading that C++ is only faster should the person be an expert in optimisation, in which, being new to C++, this would definitely not be the case. Cheers for your help.
Sparky
+2  A: 

If you have C/C++ source, consider linking it into C++/CLI .NET Assembly. This kind of project allows you to mix unmanaged code and put managed interfaces on it. The result is a simple .NET Assembly which is trivial to use in C# or VB.NET projects.

There is built in marshaling of simple types, so that you can call functions from the managed C++ side into the unmanaged side.

The only thing you need to be aware of is that when you marshall a delegate into a function pointer, that it doesn't hold a reference, so if you need the C++ to hold managed callbacks, you need to arrange for a reference to be held. Other than that, most of the built-in conversions work as expected. Visual studio will even let you debug across the boundary (turn on unmanaged debugging).

If you have a .lib, you can use it in a C++/CLI project as long as it's linked to the C-Runtime dynamically.

Lou Franco
+1  A: 

You should really prototype this in C# before you start screwing around with marshalling and unmarshalling data into unsafe structures so that you can invoke functions in a C++ DLL. C# is very often faster than you think it'll be. Prototyping is cheap.

Robert Rossney
I don't really have the time to prototype it as this will be my Final Year Project, but I think I will just go with programming it in C# in it's entirety. Cheers :)
Sparky
Well, okay, but a key point about prototyping is that it doesn't take a lot of time. It's also a fast way to get to what Fred Brooks was talking about when he said "Build one to throw away."
Robert Rossney
+2  A: 

Another possible way to go: sounds like this task is a prime target for parallelization. Build your app in such a way that it can split its workload on several CPU cores or even different machines. Then you can solve your performance problems (if there will be any) by throwing hardware at them.

Vilx-
This is actually a really good idea, I never thought of that. I'll need to do a bit of research into it but cheers for the idea!
Sparky
@Sparky - Don't hesitate to show your gratitude with an upvote! ;)
Vilx-
I can't up vote yet :( I already said that above... When I can I will.
Sparky
@Sparky - you have been blessed by the powers that are with the ability to cast a vote upwards, be it for a question, answer or comment. Use it wisely!
Vilx-
Appreciated sir :) Have an upvote!
Sparky