2013-02-16 38 views
3

我需要频繁地将数据从C++传递到C#。它应该是尽可能快因为我正在写超低延迟交易应用程序。将数据从C++传递到C# - 映射文件与CLI + UnmanagedMemoryStream

我有纯粹的C++项目(稍后将移植到Linux)。我需要从它传递数据到我的C#项目。我总是需要通过相同的结构(如果这很重要)。

结构看起来像这样:北京时间= “MSFT” 价格= “30” 体积= “10” 侧= “买入”

我想象两个选项:

  • 写C++ - CLI包装物将通过UnmanagedMemoryStream从C++到C#
  • 使用内存映射文件

会是什么:

    更快
  • 更容易实现
  • 更容易移植到Linux ?
+1

C++和C#代码最终在两个独立的进程中,或在同一个进程?即您是否需要在不同进程之间传输数据,或者通过同一进程内的托管/非托管边界传输数据? '移植到Linux'=使用单声道的C#部分? – MiMo 2013-02-16 20:42:26

+0

是的,这非常重要。我正在假设单独的进程。 – 2013-02-16 20:46:09

+0

这是同一个项目,是的,我认为它可能是相同的过程。移植到Linux很可能会将其余的C#代码重写为C++。然而,单声道也是可能的...并且将我当前的库作为“独立”应用程序可能很酷(如果不会显着影响延迟)。在几个其他进程之间共享'Ticker =“MSFT”Price =“30”Volume =“10”Side =“Buy”'''''所以需求是模糊的,但延迟肯定是最重要的部分!不过,我同意放松1-10微秒,以便拥有一些很酷的功能,例如将数据共享到其他几个进程。 – javapowered 2013-02-16 20:54:48

回答

1

内存映射文件既快速又相对容易使用。我用它们将大量的ECG数据从C#应用程序传输到C++应用程序。我也用它们来传输更小的内存块(比如一个结构体)。 它的速度与您可能获得以进行进程间数据传输一样快。 (您可能需要使用同步机制,例如信号量来控制从每端读取/写入数据。)

但是,我不知道它们是否易于移植到Linux - 但我知道Linux支持某种MMF,所以我敢打赌它不会太难。但我无法肯定地说。

注意:如果要将数据传输到正在运行in-proc的DLL中的C++函数,那完全是另一回事了,您可以使用P/Invoke来执行此操作。使用P/Invoke比使用MMF要快得多(假设数据可以被编组员固定并且不需要被复制)。一般来说,通过P/Invoke,你最终可以传递一个指向C++函数的指针。

+0

就我所知尽可能P/Invoke是比较慢的。 C++ - CLI调用应该更快! – javapowered 2013-02-16 21:14:49

+0

不,如果编组人员不需要复制内存,则P/Invoke速度不会太慢。它只需要传递一个指向非托管DLL的指针(在锁定它传递的内存块之后)。与使用MMF功能复制内存块相比,这将快得多。 – 2013-02-16 23:28:44

+0

“换句话说,C++ Interop使用尽可能快的数据封送方法,而P/Invoke使用最稳健的方法。这意味着C++ Interop(以C++典型的方式)默认提供最佳性能,程序员是负责处理这种行为不安全或不适当的情况。“从这里:http://msdn.microsoft.com/en-us/library/ky8kkddw(v=vs.80).aspx – javapowered 2013-02-20 17:19:38

2

Mono根本不支持使用混合模式C++/CLI程序集(请参阅here)。 Mono仅支持纯CLR C++程序集。
因此,似乎其他可能性,如内存映射文件,或马修建议使用P/Invoke(Mono支持,但它需要some extra work)是你应该使用,如果你打算移植到Linux。