首页 > 解决方案 > C# 加载非托管 DLL:IIS 上的控制台应用程序和 webapp 之间的巨大性能差异

问题描述

我有一个基于 ASP.NET 用 C# 编写的 webapp。它加载(使用LoadLibraryEx)一个用 C++Builder 编写的非托管 DLL。

由于我有性能问题,我做了一些测试和比较,在 DLL 中运行相同的方法很多次,获得平均时间。

我发现DLL:

  1. 由 C++Builder 控制台应用程序加载,耗时:4.922 秒
  2. 由 C# 控制台应用程序加载,耗时:5.484 秒
  3. 由托管在 IIS 7.5 上的最小 C# ASP.NET 应用程序加载,耗时:9.551 秒

如您所见,案例 1 和 2 的性能非常相似。

为什么案例3这么慢?也许 IIS 会减慢 DLL 的速度?

为此,我使用 JetBrains dotTrace 进行了分析: 在此处输入图像描述

是否有任何建议的 IIS 调整?

是否有任何建议的快速替代 IIS 来托管 ASP.NET webapps?

我应该考虑将 webapp 移植到 C++Builder 吗?

编辑

我尝试将我的 webapp 迁移到 ASP.NET Core(而不是 .NET Framework)并在 Kestrel 上运行它。它需要 6.042 秒。因此,与控制台应用程序相比,开销并不大。似乎 IIS 是罪魁祸首……为什么?

标签: c#asp.netperformanceiisunmanaged

解决方案


可能解释您的结果的一个原因是 IIS 不会(默认情况下)加载您的 Web 应用程序,直到第一次访问它。这可能会导致它花费更长的时间,因为它会在您导航到该站点后启动整个应用程序,而控制台应用程序将在调用它的类加载到内存后立即加载该库。


推荐阅读