Aspnet Boilerplate/Aspnet Zero slow(IoC)

Her*_*ert 4 asp.net-mvc dependency-injection castle-windsor aspnetboilerplate

我将aspnetboilerplate/aspnetzero模板用于我的Multi-Tenant SaaS应用程序和Multi-Database.这使用CastleWindsor作为DI Framework.

我遇到了非常糟糕的性能,我用dotTrace跟踪它 - 它说Castle.MicroKernel是最活跃的代码.

我的请求大约需要5-6秒,并且大部分时间都会超过控制器.(在调试时)我认为解析所有服务/控制器的速度很慢.我将一些依赖项(App-Services)从Transient更改为PerWebRequestLifetime,但它并没有影响性能.

有谁知道,我怎样才能获得更好的表现?

在我的视图(_Layout文件)中,我调用几个不同的Childactions,它们在Layoutcontroller上,此Controller获取以下服务注入:

     public LayoutController(
        IPerSessionCache sessionCache,
        IUserNavigationManager userNavigationManager,
        IMultiTenancyConfig multiTenancyConfig,
        ILanguageManager languageManager,
        ITenancyNameFinder tenancyNameFinder,
        TenantManager tenantManager,
        IUserLinkAppService userLinkAppService,
        UserManager userManager)
Run Code Online (Sandbox Code Playgroud)

行动是

[ChildActionOnly]
    public PartialViewResult AppHeader()
    {
        var headerModel = new Areas.Mpa.Models.Layout.HeaderViewModel
        {
            LoginInformations = AsyncHelper.RunSync(_sessionCache.GetCurrentLoginInformationsAsync),
            Languages = _languageManager.GetLanguages(),
            CurrentLanguage = _languageManager.CurrentLanguage,
            IsMultiTenancyEnabled = _multiTenancyConfig.IsEnabled,
            IsImpersonatedLogin = AbpSession.ImpersonatorUserId.HasValue,
            HasLinkedAccounts = AsyncHelper.RunSync(_userLinkAppService.HasLinkedAccounts)
        };

        return PartialView("~/Views/Layout/_AppHeader.cshtml", headerModel);
    }

[ChildActionOnly]
    public PartialViewResult AppNavbar(string currentPageName = "")
    {
        var sidebarModel = new Areas.Mpa.Models.Layout.NavbarViewModel
        {        
            Menu = AsyncHelper.RunSync(() => _userNavigationManager.GetMenuAsync(MeNavigationProvider.MenuName, AbpSession.ToUserIdentifier())),
            CurrentPageName = currentPageName
        };

        return PartialView("_AppNavbar", sidebarModel);
    }
Run Code Online (Sandbox Code Playgroud)

和类似的...但我用一个空的布局文件检查了性能,但我的请求仍然需要太长时间

Alp*_*glu 6

ASP.NET Boilerplate性能基准测试结果

我们创建了两个相同的简单应用程序:一个使用ABP(https://github.com/aspnetboilerplate/aspnetboilerplate-samples/tree/master/TestProjects/AbpPerformanceTestApp)

和其他没有ABP(https://github.com/aspnetboilerplate/aspnetboilerplate-samples/tree/master/TestProjects/StandartTestApp)

二手框架

  • ASP.NET Core 1.x
  • EF Core 1.x

测试工具

我们使用jMeter进行测试.

检测结果

没有ABP

没有ABP

有了ABP

有了ABP

从统计数据中可以看出,ABP在默认的asp.net代码之上增加了平均5ms的开销.由于此开销是CPU使用率,因此吞吐量平均为5%不同.

我们禁用了ABP的日志记录和事务处理以便更好地进行比较(记录特别是效果性能,因为它使用I/O).默认情况下启用其他方面,过滤器和功能.


Her*_*ert 6

感谢史蒂文斯的评论:

确保注入构造函数是快速的。您可能在对象图构造期间正在执行某种I / O。

我实际上发现,这就是问题所在。我们的服务之一在构造函数中执行了I / O操作-这非常慢,并且导致实例化IoC容器的性能下降。