C# 加载非托管 DLL:IIS 上的控制台应用程序和 webapp 之间的巨大性能差异
Posted
技术标签:
【中文标题】C# 加载非托管 DLL:IIS 上的控制台应用程序和 webapp 之间的巨大性能差异【英文标题】:C# loading an unmanaged DLL: big performance difference between console application and webapp on IIS 【发布时间】:2020-11-07 10:35:32 【问题描述】:我有一个基于 ASP.NET 的用 C# 编写的 webapp。
它加载(使用LoadLibraryEx
)一个用 C++Builder 编写的非托管 DLL。
由于遇到性能问题,我做了一些测试和比较,在 DLL 中总是运行相同的方法,多次运行,获得平均时间。
我发现 DLL:
-
由 C++Builder 控制台应用程序加载,耗时:4.922 秒
由 C# 控制台应用程序加载,耗时:5.484 秒
由托管在 IIS 7.5 上的最小 C# ASP.NET 应用程序加载,耗时:9.551 秒
如您所见,案例 1 和 2 的性能非常相似。
为什么案例 3 这么慢?也许 IIS 会减慢 DLL 的速度?
为此,我使用 JetBrains dotTrace 进行了分析:
是否有任何建议的 IIS 调整?
对于托管 ASP.NET Web 应用程序,是否有任何建议的快速替代 IIS 的方法?
我应该考虑将 webapp 移植到 C++Builder 吗?
编辑:
我尝试将我的 web 应用程序迁移到 ASP.NET Core(而不是 .NET Framework)并在 Kestrel 上运行它。它需要 6.042 秒。因此,与控制台应用程序相比,开销并不大。 看来 IIS 是罪魁祸首……为什么?
【问题讨论】:
您在哪个运行时运行这 2 个 C# 应用程序?当您进行测试时,它们是在发布还是调试?您是只测试函数调用还是应用程序启动? @Blindy,运行时是指.NET Framework? .NET 4。我总是在发布模式下构建。我只测试了函数调用。 你确定他们俩都是 .Net 4 吗?因为那是一个真正古老的运行时,你至少落后于 Net Core、Net 5 和更现代的 Net Framework 4.6+ 的 3 个完整版本。 @Blindy 我检查了:Web 和控制台应用程序都将 .NET Framework 4.7.2 作为项目属性中的目标框架。 原来是古ASP.NET。好的,IIS 托管呢,它是进程外(经典)还是集成?您是否为此设置了正确的应用程序池?它是专门用于您的应用程序还是共享池? 【参考方案1】:可能解释您的结果的一个原因是 IIS 不会(默认情况下)加载您的 Web 应用程序,直到它第一次被访问。这可能会导致它花费更长的时间,因为它会在您导航到该站点后启动整个应用程序,而控制台应用程序将在调用它的类加载到内存后立即加载该库。
【讨论】:
谢谢 Eric,但我只是为我正在测试的方法测量时间。 DLL 在很久以前就被加载和初始化了。以上是关于C# 加载非托管 DLL:IIS 上的控制台应用程序和 webapp 之间的巨大性能差异的主要内容,如果未能解决你的问题,请参考以下文章