通过P/Invoke包装器或在c#中运行进程调用本机代码的性能

本文关键字:进程 运行 调用 本机代码 性能 Invoke 包装 通过 | 更新日期: 2023-09-27 17:49:36

我有一些用c++编写并编译成可执行文件的本地应用程序。

我们需要在c#的服务中运行此服务,我想知道创建包装器项目是否有任何不同,这样可以通过c++/CLI项目或p/调用轻松地从c#调用它,或者只是启动一个调用。exe文件的进程,就像我们从命令行做的那样?

因为它更容易从c#中使用,如果它只是取一个命名空间并调用一个c#函数来处理事情。我可以很容易地创建一个函数,启动对命令行exe的进程调用,并以这种方式获得结果。

两种方法是否有性能差异,因为这很可能是关键因素,因为我们可以很容易地实现这两种方法。

还使用c++/CLI包装器使变量的传输更容易。

通过P/Invoke包装器或在c#中运行进程调用本机代码的性能

因为在c#中使用一个命名空间更容易并调用一个c#函数来处理

这取决于性质你的应用程序将使用C++代码做什么。当然,它将更容易调试。

在包装器的情况下,性能应该更好,就像在EXE的情况下,你需要启动EXE,这可能会花费一些无关紧要的时间。在包装器的情况下,在托管和非托管代码之间传输数据存在性能瓶颈。顺便说一下,应该小于可执行的运行。

所有这些都取决于具体的应用程序生命周期,实际上只能由您在具体的上下文中进行测量。

我的选择是:

  • 如果调用不那么频繁,将其保持为单独的可执行文件。

  • 另一方面,如果调用仍然不是那么频繁,但需要传递给调用和从调用传递的数据量足够大,可以考虑包装。如果您的数据是或可以是文件,那么选择EXE可能再次有效,因此您只需将文件路径传递给可执行文件。

  • 如果呼叫足够频繁,使用wrapper

重复,这些只是考虑,在你的具体情况下可能会也可能不会带来一些实际的好处。

存在性能差异。然而,与所有性能调整一样,关键是性能分析。使用更简单的方法,并检查它是否正确。

p/Invoke和c++/CLI方式之间的主要性能差异是封送,这在p/Invoke中是自动的(通过一些自定义)。