通过P/Invoke包装器或在c#中运行进程调用本机代码的性能
Performance of calling native code by either a P/Invoke wrapper or running a process in c#
我有一些用c++编写并编译成可执行文件的本地应用程序。
我们需要在c#的服务中运行此服务,我想知道创建包装器项目是否有任何不同,这样可以通过c++/CLI项目或p/调用轻松地从c#调用它,或者只是启动一个调用。exe文件的进程,就像我们从命令行做的那样?
因为它更容易从c#中使用,如果它只是取一个命名空间并调用一个c#函数来处理事情。我可以很容易地创建一个函数,启动对命令行exe的进程调用,并以这种方式获得结果。
两种方法是否有性能差异,因为这很可能是关键因素,因为我们可以很容易地实现这两种方法。
还使用c++/CLI包装器使变量的传输更容易。
因为在c#中使用一个命名空间更容易并调用一个c#函数来处理
这取决于性质你的应用程序将使用C++
代码做什么。当然,它将更容易调试。
在包装器的情况下,性能应该更好,就像在EXE的情况下,你需要启动EXE,这可能会花费一些无关紧要的时间。在包装器的情况下,在托管和非托管代码之间传输数据存在性能瓶颈。顺便说一下,应该小于可执行的运行。
所有这些都取决于具体的应用程序生命周期,实际上只能由您在具体的上下文中进行测量。
我的选择是:
-
如果调用不那么频繁,将其保持为单独的可执行文件。
-
另一方面,如果调用仍然不是那么频繁,但需要传递给调用和从调用传递的数据量足够大,可以考虑包装。如果您的数据是或可以是文件,那么选择EXE可能再次有效,因此您只需将文件路径传递给可执行文件。
-
如果呼叫足够频繁,使用wrapper
重复,这些只是考虑,在你的具体情况下可能会也可能不会带来一些实际的好处。
存在性能差异。然而,与所有性能调整一样,关键是性能分析。使用更简单的方法,并检查它是否正确。
p/Invoke和c++/CLI方式之间的主要性能差异是封送,这在p/Invoke中是自动的(通过一些自定义)。
- IPC使用多个管道和分支进程来运行Python程序
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 运行代码时,c++ 会终止进程
- 从 C++ 运行的进程偶尔会错过某个选项
- 父进程意外被子 cmd 杀死.exe运行 java jar 的进程 - WINDOWS 7 问题 - C++
- 如何在不丢失输出的情况下杀死/停止终端中正在运行的进程?
- Windows 将标准的 C 文件结构注入到正在运行的进程中
- 如何使用 c++ libboost 运行进程并获取其输出?
- 从Visual Studio 2017运行MPI应用程序,每个进程在不同的cmd窗口中
- GDB:运行不带符号的 cpp 进程调试
- 在程序继续C++时保持进程运行
- CLion 如何终止进程运行?
- 两个并发的 Python 进程可以在 Boost Python 中运行吗?
- 获取正在运行的进程的模块数
- C++ 减慢另一个正在运行的进程
- Linux 守护进程 - 运行函数两次
- SYSTEM_INFO::d wActiveProcessorMask是否可以在我的进程运行时更改
- 如何保持进程运行
- 程序(nload)在shell中执行时作为守护进程运行,但不在启动/自动化脚本中执行
- 从Mono上运行的C#进程运行C++应用程序.运行检测器错误