从C+传递数据+;到C#-映射文件vs CLI+;非托管内存流 我需要经常从C++传递数据到C语言。在我编写超低延迟交易应用程序时,它应该尽可能快 我有纯C++项目(稍后将移植到Linux)。我需要将数据从它传递到我的C#项目。我总是需要通过相同的结构(如果这很重要)

从C+传递数据+;到C#-映射文件vs CLI+;非托管内存流 我需要经常从C++传递数据到C语言。在我编写超低延迟交易应用程序时,它应该尽可能快 我有纯C++项目(稍后将移植到Linux)。我需要将数据从它传递到我的C#项目。我总是需要通过相同的结构(如果这很重要),c#,c++-cli,unmanaged-memory,map-files,C#,C++ Cli,Unmanaged Memory,Map Files,结构如下所示:Ticker=“MSFT”Price=“30”Volume=“10”Side=“Buy” 我想有两种选择: 编写C++将CLI包装器通过C++将未管理的内存流传递到C< 使用内存映射文件 什么是: 更快 易于实现 更容易移植到Linux ? 内存映射文件既非常快速,也相对易于使用。我已经用它们把大量的心电图数据从C语言应用程序转移到C++应用程序。我还使用它们来传输较小的内存块(如结构)。这是进程间数据传输的最快速度。(您可能需要使用同步机制(如信号灯)来控制两端数据的读取/

结构如下所示:Ticker=“MSFT”Price=“30”Volume=“10”Side=“Buy”

我想有两种选择:

  • 编写C++将CLI包装器通过C++将未管理的内存流传递到C<
  • 使用内存映射文件
什么是:

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

内存映射文件既非常快速,也相对易于使用。我已经用它们把大量的心电图数据从C语言应用程序转移到C++应用程序。我还使用它们来传输较小的内存块(如结构)。这是进程间数据传输的最快速度。(您可能需要使用同步机制(如信号灯)来控制两端数据的读取/写入。)

然而,我不知道它们是否易于移植到Linux——但我知道Linux支持某种MMF,所以我打赌这不会太难。但我不能肯定


注意:如果你想把数据传递到一个在PRC中运行的DLL中的C++函数,那就完全不同了,你可以用p/Unjk来做。使用P/Invoke将比使用MMF快得多(假设数据可以由封送拆收器固定并且不需要复制)。一般来说,用P/Unjk,你可以只传递一个指针到C++函数。

< P>使用Myo根本不支持混合模式C++ + CLI程序集(参见)。MUNO只支持纯CLR C++程序集。
因此,似乎其他的可能性,如内存映射文件,或者马修建议使用P/INKEKE(虽然它需要支持,但是如果你计划将端口移植到Linux),那么你应该使用的是什么?< /P> C++和C代码是在两个不同的进程中结束的,还是在同一个进程中?即,您是否需要在不同进程之间传输数据,或通过同一进程内的托管/非托管边界传输数据?”移植到Linux’=在C#部分使用Mono?是的,这是非常重要的一点。我假设是不同的过程。这是同一个项目,是的,我假设可能是同一个过程。移植到Linux很有可能将其余的C代码改写为C++。然而,单声道也是可能的。。。将我当前的库作为“独立”应用程序可能会很酷(如果不会显著影响延迟的话)。在其他几个流程之间共享
Ticker=“MSFT”Price=“30”Volume=“10”Side=“Buy”
会很酷。所以需求是模糊的,但延迟肯定是最重要的部分!不过,我同意为一些很酷的功能(如向其他几个进程共享数据)留出1-10微秒的时间。我不是Linux专家,但似乎
mmap
在Linux中速度非常快。所以我可能需要在Windows中使用类似的东西,以便以后可以轻松地移植它……据我所知,P/Invoke相对较慢。C++-CLI调用应该更快!不,如果封送拆收器不必复制内存,那么P/Invoke并不慢。它只需传递一个指向非托管DLL的指针(在固定它正在传递的内存块之后)。与使用MMF函数复制内存块相比,这将是非常快的。“换句话说,C++互操作使用最快的数据封送方法,而P/UnjKE使用最健壮的方法。这意味着C++互操作(以C++为典型的方式)。默认情况下提供最佳性能,程序员负责解决这种行为不安全或不适当的情况。”从这里开始: