从VB.net调用本地c ++ dll运行速度比从本机.exe调用运行慢

时间:2011-08-28 13:54:21

标签: .net c++ vb.net dll c++-cli

我在本机C ++(Visual C ++ 2010)中有一些代码来处理一些GB的文件。我把它编译成.exe,大约需要8分钟。但是我需要从Visual Basic .net接口调用它,所以我将它放在.dll中并创建了一个c ++ / cli包装类来在本机dll中调用我的代码。托管代码和本机dll之间唯一的交互是调用启动处理的函数。令我惊讶的是,处理所需的时间几乎是.exe方式的两倍。我不是VB.net的专家,所以也许有一些设置或什么东西要看,我不知道。欢迎任何想法。提前谢谢。

5 个答案:

答案 0 :(得分:1)

一些想法:

  • 也许您使用Release配置构建了.exe,但.dll设置为Debug。您有时会发现版本和调试版本之间存在很大差异,优化的代码会产生巨大的差异。

  • 如果您的VB.net除了调用C ++代码之外还执行任何操作,那么它可能会在您的.dll消耗之上添加CPU负载。在VB.net端进行的任何类型的后台处理都可以解释差异。要比较苹果和苹果,您应该有一个没有GUI的命令行VB.net应用程序和一行调用dll函数。

  • 如果上述方法无效,我建议您创建一个链接到同一DLL的本机C ++应用程序,并将其与本机exe版本进行比较。如果C ++和DLL版本的执行与C ++独立的exe相同,那么VB.net上就会出现消耗额外CPU的问题。另一方面,如果在从本机C ++调用时DLL也很慢,那么你应该在exe与dll的构建过程中寻找差异,或者在exe与dll模式的宏/条件编译中找出差异。

祝你好运。

答案 1 :(得分:0)

C ++ / CLI包装器真的只是调用DLL函数,还是加载DLL本身,然后坚持并由.NET管理?本机过程是获取自己的线程,还是在.NET的上下文中创建的线程?我的直觉是.NET正在做一些不必要的事情来管理对象,DLL或线程的生命周期。

因此,我的建议是添加一个事件来指示DLL正在完成它正在做的任何事情,从本机DLL启动一个新线程来运行该过程,并立即返回事件句柄。让你的.NET在适当的地方等待。

答案 2 :(得分:0)

不太明白为什么从DotNet端调用的本机dll可以将处理时间加倍,除非你能提供更多细节。

但是,如果本机exe版本按预期工作,您可以从DotNet运行本机exe作为后台进程,通过命令行传递api参数。您甚至可以将exe的控制台输出重定向到基于DotNet的GUI。

答案 3 :(得分:0)

这很奇怪。我会查看任务管理器中的所有列,并比较两个进程(工作集大小,页面错误,......)。然后我会看一下性能监视器并查看缓存管理器的值。最后但并非最不重要的是,您可以尝试仅从文件中读取而不是写入以查看花费的时间。

答案 4 :(得分:-1)

.NET框架在从“托管”代码到本机代码或“非托管”代码进行通信时会产生一些开销。 See here for some background.

所以你在性能方面所看到的就是我一般所期望的。如果本机DLL做得更多,我希望通信开销(效率惩罚)的百分比更低。