C++ backend with C# frontend?
我有一个项目,在这个项目中,如果不是每秒处理1000条消息,我将不得不处理100条消息,并相应地在图形上处理/绘制这些数据(用户将搜索一组数据,其中图形将实时绘制,而不是字面上必须在图形上绘制1000条值)。
我很难理解使用DLL让大部分的消息处理在C++中,然后把信息交给C接口。有人能在这里帮我把它说哑吗?
此外,速度将是一个优先事项,我想知道,如果访问2个不同的代码层,将有更多的性能击中,在整个项目中的C语言编程,或当然是C++,虽然我已经阅读了有关编程C++中的GUI的坏东西,其中,这个应用程序还必须看起来现代化,干净,专业等,所以我是墨水C将是前进的道路(可能是XAML、WPF)
谢谢你抽出时间。
C/C++ DLL与.NET程序集互操作最简单的方法是通过P/UnjKE。在C/C++方面,创建一个DLL。在C端,您创建一个P/Invoke声明。例如,假设您的dll是mydll.dll,它导出方法
1 2 | [DllImport("mydll.dll")] extern static void Foo(); |
就是这样。您只需像其他任何静态类方法一样调用foo。最困难的部分是数据整理,这是一个复杂的主题。如果您正在编写DLL,您可能会不遗余力地使导出函数易于编组。有关P/Invoke封送处理主题的更多信息,请参阅:http://msdn.microsoft.com/en-us/magazine/cc164123.aspx。
当使用p/invoke时,您将受到性能影响。每次托管应用程序进行非托管方法调用时,都会遇到跨越托管/非托管边界的命中,然后再次返回。当您封送数据时,会进行大量复制。如果需要,可以使用"不安全"C代码(使用指针直接访问非托管内存)减少复制。
您应该注意的是,所有.NET应用程序都充满了P/Invoke调用。任何.NET应用程序都不能避免进行操作系统调用,并且每个操作系统调用都必须跨入操作系统的非托管世界。winforms甚至wpf-gui应用程序使这一过程每秒进行数百次,甚至数千次。
如果这是我的任务,我会先在C中100%完成。然后我会对它进行分析,并根据需要调整性能。
如果速度是你的优先选择,C++可能是更好的选择。尝试对计算的实际难度做出一些估计(如果每个消息的计算都很简单,那么在C中处理1000条消息就很简单,即使是最佳优化的程序也很难处理1000条消息)。如果你的算法复杂,涉及不同的类,C++可能比C语言有更多的优点(关于性能)。
您可能想看看这个问题以进行性能比较。
将后端和前端分离是一个好主意。如果在C++和C语言中有一个性能损失取决于实际需要多少数据转换。
我不认为对GUI进行编程是一件很麻烦的事情。MFC可能很痛,但qt不是(imho)。
也许这给了你一些要点!
另一种可能的方法是:听起来这项任务是并行化的主要目标。以这样一种方式构建应用程序,它可以将工作负载拆分到几个CPU核心,甚至是不同的机器上。然后,您可以通过向它们扔硬件来解决性能问题(如果有)。
如果您有C/C++源,请考虑将其链接到C++/CLI.NET程序集。这种项目允许混合使用非托管代码并在其上放置托管接口。其结果是一个简单的.NET程序集,在C或VB.NET项目中使用起来很简单。
存在简单类型的内置封送处理,以便可以从托管C++侧调用非托管侧的函数。
唯一需要注意的是,当你将委托转换成函数指针时,它不保存引用,所以如果你需要C++来保存管理回调,你需要安排一个引用。除此之外,大多数内置转换都能按预期工作。Visual Studio甚至允许您跨越边界进行调试(启用非托管调试)。
如果你有一个.LIB,你可以在C++/CLI项目中使用它,只要它是动态链接到C运行时的。
在C语言中,你应该先把这个原型做成原型,然后开始编组和解压缩数据到不安全的结构中,这样你就可以在C++的DLL中调用函数。C通常比你想象的要快。原型制作很便宜。