Performance Can C#和C++;高性能代码的互操作? 我们有传统C++代码执行高性能数据处理(例如,从硬件设备提供的大量数据,这些数据以时间敏感的方式处理以显示、转换和传输到辅助存储)。 我们对新的GUI和新的实用程序(现有的GUI是C++ MFC和QT)有兴趣。当然,对于现有系统,我们对.NET虚拟机没有“语言翻译”问题(现有代码都是C++)

Performance Can C#和C++;高性能代码的互操作? 我们有传统C++代码执行高性能数据处理(例如,从硬件设备提供的大量数据,这些数据以时间敏感的方式处理以显示、转换和传输到辅助存储)。 我们对新的GUI和新的实用程序(现有的GUI是C++ MFC和QT)有兴趣。当然,对于现有系统,我们对.NET虚拟机没有“语言翻译”问题(现有代码都是C++),performance,c++-cli,legacy-code,Performance,C++ Cli,Legacy Code,经过大量的研究和大量的书籍,我不确定这是否能有效地做到。可能的方法(我是否遗漏了任何方法?) 重写.NET中的所有内容(无法 发生过多代码、裸机设备访问、时间敏感的繁重算法处理) 用于托管服务器的精简适配器层 C++/CLI 管理层的厚适配器层 C++/CLI 不要使用.NET(管理者感觉很棒 (悲伤) 我们关注(2)“瘦适配器层”,如果GUI可以(重新)使用“业务”层中的逻辑(许多属性是算法性的),那就太好了,所以如果我们不暴露/包装C++类,那么很多GUI逻辑只会复制业务层中现有的C++逻辑

经过大量的研究和大量的书籍,我不确定这是否能有效地做到。可能的方法(我是否遗漏了任何方法?)

  • 重写.NET中的所有内容(无法 发生过多代码、裸机设备访问、时间敏感的繁重算法处理)
  • 用于托管服务器的精简适配器层 C++/CLI
  • 管理层的厚适配器层 C++/CLI
  • 不要使用.NET(管理者感觉很棒 (悲伤)
  • 我们关注(2)“瘦适配器层”,如果GUI可以(重新)使用“业务”层中的逻辑(许多属性是算法性的),那就太好了,所以如果我们不暴露/包装C++类,那么很多GUI逻辑只会复制业务层中现有的C++逻辑。

    我们关注(3)“厚适配器层”是用C++类来封装每个C++类似乎很繁琐(昂贵),并且有几本书建议跨越该边界的装箱/解压访问似乎表明这种方法是不可行的/禁止的(它的性能超出了微小的设计)。


    < >如何在C++中实现一个深层的富类结构之上的新的C*y/Net(GUI)?跨越边界是昂贵的,您不希望为了细粒度操作而这样做。多细粒度?当然,这要看情况而定

    在理想情况下,C++代码被分层为一个Rational对象模型,在其中可以放置一个COM层(或类似的)来进行更大粒度的操作。例如,与其公开一个具有5个属性的对象,以及每个属性上的setter/getter对,不如公开一个SetProperties()方法,该方法接受要设置的所有属性的映射。这绝不是你需要注意的唯一情况;这只是一个如何偏向更大粒度操作的示例

    关于COM-这很好,但当然不是必需的。使用COM对您强制执行一项规程,因为您需要在COM接口中正式定义操作。如果没有COM提供的正式实施,您的团队可能会“作弊”——并暴露层之间的许多战术集成点,这可能会导致潜在的性能问题

    如果您有可靠的项目管理和优秀的团队成员,那么您就可以执行这些项目标准,而不必依赖COM的形式。在C#中定义您自己的包装器类,所有边界交叉都通过它发生

    我怀疑,底线是,除非你仔细考虑并测试它,否则你不会确切知道正确的决定


    找几个团队成员,好的开发人员,让他们构建两个不同选项的原型。例如,薄与厚,这些术语的确切含义由您定义。给他们3周左右的时间把东西组装起来。然后衡量他们的生产率和绩效,并据此做出决定。

    您对约束的想法是正确的。跨越边界是昂贵的,您不希望为了细粒度操作而这样做。多细粒度?当然,这要看情况而定

    在理想情况下,C++代码被分层为一个Rational对象模型,在其中可以放置一个COM层(或类似的)来进行更大粒度的操作。例如,与其公开一个具有5个属性的对象,以及每个属性上的setter/getter对,不如公开一个SetProperties()方法,该方法接受要设置的所有属性的映射。这绝不是你需要注意的唯一情况;这只是一个如何偏向更大粒度操作的示例

    关于COM-这很好,但当然不是必需的。使用COM对您强制执行一项规程,因为您需要在COM接口中正式定义操作。如果没有COM提供的正式实施,您的团队可能会“作弊”——并暴露层之间的许多战术集成点,这可能会导致潜在的性能问题

    如果你有坚实的项目管理和优秀的团队成员,那么你可以在不依赖COM的形式的情况下执行这些项目标准。在C#中定义您自己的包装器类,所有边界交叉都通过它发生

    我怀疑,底线是,除非你仔细考虑并测试它,否则你不会确切知道正确的决定


    找几个团队成员,好的开发人员,让他们构建两个不同选项的原型。例如,薄与厚,这些术语的确切含义由您定义。给他们3周左右的时间把东西组装起来。然后衡量他们的生产率和性能,并据此做出决定。

    C++/CLI非常适合这样做。托管/非托管转换没有性能问题,因为C++/CLI使用与.NET运行时引擎本身相同的优化调用技术来实现高性能方法,如字符串连接

    当您在.NET和同一数据结构的本机版本之间来回复制数据时,会出现性能问题,但在使用BSTR的库和使用
    std::string
    的库时,您也会遇到同样的问题,而且缓慢的操作也同样明显(与P/Invoke不同,P/Invoke试图使这些转换透明,并最终隐藏流程中的性能问题)

    还有一些技巧可以用来克服这个问题,例如ins