【问题标题】:passing data from C++ to C# - mapping file vs CLI+UnmanagedMemoryStream将数据从 C++ 传递到 C# - 映射文件与 CLI+UnmanagedMemoryStream
【发布时间】:2013-02-16 20:25:40
【问题描述】:

我需要经常将数据从 C++ 传递到 C#。它应该尽可能快,因为我正在编写超低延迟交易应用程序。

我有一个纯C++项目(以后会移植到Linux上)。我需要将数据从它传递到我的 C# 项目。我总是需要传递相同的结构(如果这很重要的话)。

结构如下: Ticker = "MSFT" Price = "30" Volume = "10" Side = "Buy"

我想有两种选择:

  • 编写 C++-CLI 包装器,它将 UnmanagedMemoryStream 从 C++ 传递到 C#
  • 使用内存映射文件

会是什么:

  • 更快
  • 更容易实施
  • 更容易移植到 Linux ?

【问题讨论】:

  • C++ 和 C# 代码最终在两个独立的进程中,还是在同一个进程中? IE。您是否需要在不同进程之间或通过同一进程内的托管/非托管边界传输数据? '移植到 Linux' = 在 C# 部分使用 Mono?
  • 是的,这很重要。我假设有单独的进程。
  • 这是同一个项目,是的,我认为它可能是同一个过程。移植到 Linux 很可能是将其余的 C# 代码重写为 C++。然而,单声道也是可能的......并且将我当前的库作为“独立”应用程序可能很酷(如果不会显着影响延迟)。在其他几个进程之间共享Ticker = "MSFT" Price = "30" Volume = "10" Side = "Buy" 会很酷。所以要求很模糊,但延迟肯定是最重要的部分!不过,我同意花 1-10 微秒的时间来提供一些很酷的功能,例如与其他几个进程共享数据。
  • 我不是 Linux 专家,但似乎 mmap 在 Linux 中的速度非常快。所以我可能需要在 Windows 中使用类似的东西,这样我以后可以轻松地移植它....

标签: c# c++-cli unmanaged-memory map-files


【解决方案1】:

在 Mono 上根本不支持使用混合模式 C++/CLI 程序集(请参阅 here)。 Mono 仅支持纯 CLR C++ 程序集。
因此,如果您计划移植到 Linux,您应该使用其他可能性,例如内存映射文件,或者 Matthew 建议使用 P/Invoke(Mono 支持,尽管它需要 some extra work)。 /p>

【讨论】:

    【解决方案2】:

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

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

    注意:如果您想将数据传输到在进程内运行的 DLL 中的 C++ 函数,则完全不同,您只需使用 P/Invoke 即可。使用 P/Invoke 将比使用 MMF 快得多(假设数据可以由编组器固定并且不需要复制)。一般来说,使用 P/Invoke 你最终可以只传递一个指向 C++ 函数的指针。

    【讨论】:

    • 据我所知,P/Invoke 相对较慢。 C++-CLI 调用应该更快!
    • 不,如果编组器不必复制内存,P/Invoke 并不慢。它只需要传递一个指向非托管 DLL 的指针(在固定它传递的内存块之后)。与使用 MMF 函数复制内存块相比,这会快很多。
    • "换句话说,C++ Interop 使用最快的数据封送方法,而 P/Invoke 使用最稳健的方法。这意味着 C++ Interop(以 C++ 的典型方式)提供最佳性能默认情况下,程序员负责解决这种行为不安全或不适当的情况。”从这里:msdn.microsoft.com/en-us/library/ky8kkddw(v=vs.80).aspx
    猜你喜欢
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多