从第二个AppDomain管理到非托管转换非常慢

bri*_*ler 7 c# c++-cli appdomain

设置如下:

  • 主应用程序域从C++/CLI程序集加载许多非托管C++库.
  • 第二个应用程序域加载那些C++库,但当然它只是获取以前加载的库的句柄.
  • 我在两个使用非托管C++库的应用程序域中运行完全相同的托管C#代码.
  • C++/CLI程序集包含托管代码和非托管代码的混合.

从主应用程序域调用非托管C++库时,与总执行成本相比,托管到非托管转换的成本相当可忽略不计.但是,从最初没有加载库的第二个应用程序域,托管到非托管转换的成本变得很大; 数量级更大.我知道这是因为我已经运行了ANTS性能分析器,这就是它告诉我的.

C++/CLI程序集中有一些非托管静态变量,我在创建新的应用程序域时尝试替换它们,但这并没有改变性能.很可能会有一堆隐藏的.

这可能会发生什么?为什么其他应用领域的转换速度如此之慢?试图改善事情有什么明显之处吗?

某些上下文:代码在单独的应用程序域中运行以进行隔离,以便在出现问题时将其拆除.将它与主app域隔离是非常好的.可以启动一个运行非托管代码的新进程,但这可能很昂贵,因为它可能需要大量数据进行序列化和反序列化,并且在新进程中引导所有内容的成本也相当大.在一般情况下,序列化和引导程序的成本将远远低于我所看到的托管到非托管转换的成本,但是涉及到很多混乱,它仍然会减慢很多事情.