在我的公司,我们正在评估是否从一个应用程序切换到另一个应用程序,我有一些性能问题(这可能是胡说八道......)我已经阅读了一些 COM 文章,我最清楚的是它与语言无关,但是什么关于性能?
我们通过 ac# API 使用第 3 方电网求解器,但我们对此并不完全满意。(使用 API 和 COM 一样吗?)
竞争对手都使用 COM 通信。
由于我们将给程序的使用将在一个随机模拟框架中,是否值得使用 COM 通信?会很慢吗?
我完全没有这方面的经验,我想要一些光。
提前致谢
在我的公司,我们正在评估是否从一个应用程序切换到另一个应用程序,我有一些性能问题(这可能是胡说八道......)我已经阅读了一些 COM 文章,我最清楚的是它与语言无关,但是什么关于性能?
我们通过 ac# API 使用第 3 方电网求解器,但我们对此并不完全满意。(使用 API 和 COM 一样吗?)
竞争对手都使用 COM 通信。
由于我们将给程序的使用将在一个随机模拟框架中,是否值得使用 COM 通信?会很慢吗?
我完全没有这方面的经验,我想要一些光。
提前致谢
进行 COM 通信时基本上有两种可能性:1)进程内,2)进程外。
如果您想要最大的性能,您真的想使用进程内 COM(您的代码将与您的客户端代码在同一进程中运行,因此不涉及序列化或“编组”)。在这种情况下,实际上并没有任何“通信”层。COM 是一个非常简单的二进制合约。这里有描述:COM 对象的布局
更多关于 v-table 性能的信息可以在这里找到:虚拟方法表
请注意,进程内 COM 有一些微妙之处,尤其是线程模型。即使在进程中,您也要确保选择适合您的客户端/调用代码的线程模型。因此,在文章的“混合模型开发”一章中,您想要“直接访问”,而不是“编组”(在表格中)。
组件供应商通常会偏爱 COM 接口,因为这使得他们的产品可以在更多的运行时环境中使用。包括来自 C++、Delphi 或任何脚本语言等语言。而 C#,.NET 框架对 COM 互操作有很好的支持,它看起来像一个原生 C# 接口。确保您尚未使用 COM 并且只是不知道它。您可以从部署说明中获得提示,COM 组件通常需要清单或安装程序。
第二个考虑因素是,COM 通常是已经存在很长时间、10 年或更长时间的产品的广告接口。这可能适用于通用的“网格求解器”类型的产品。产品稳定十年,没有添加任何新的花里胡哨。这是您要注意的事情,您通常很难获得对此类产品的支持,因为供应商不再有程序员在产品上工作。当您更换产品所依赖的核心库时,获得良好的支持总是很重要的。
当您遇到性能问题时,支持尤其重要。您自己无能为力来解决它们,您真的希望能够与供应商合作以解决它们。
如果源是 api 层开销,那么 COM 肯定不是性能问题的神奇解决方案。如果求解器是一个单独的进程,则可能会出现这种情况,这样的互操作成本很高。您可以在 Taskmgr.exe 的“进程”选项卡中轻松看到的内容,当您运行应用程序时,您会看到另一个 EXE 弹出。无论如何,COM 不可避免地包含从托管代码到非托管代码的转换。它通常很快,但如果 api 调用非常细粒度,那么它可以加起来。