DynamicProxy生成速度

Jef*_*eff 5 .net dependency-injection castle-windsor castle-dynamicproxy

我正在尝试解决一些启动时间问题.在做了一些分析之后,我发现主要的罪魁祸首是ClassProxyGenerator.GenerateCode.这种类型第一次需要400-600ms.因此,如果应用程序的入口点有8个需要代理生成的依赖项(在链中),则应用程序的启动时间会增加4.8秒.这可能看起来不是很多,但对于用户来说,它似乎很年轻.

有什么改进的建议吗?

更新:

我可以使用以下控制台应用程序重现时间:

        var container = new WindsorContainer();
        container.Register(Component.For<Interceptor>()); // dummy IInterceptor...does nothing
        container.Register(Component.For<IMyRepository, MyAbstractRepository>().Interceptors<Interceptor>());
        var t = DateTime.Now;
        var instance = container.Resolve<IMyRepository>();
        Debug.WriteLine("Resolved in " + (DateTime.Now - t).TotalMilliseconds);
Run Code Online (Sandbox Code Playgroud)

输出介于550ms和750ms之间.

IMyRepository是30个实体类型的存储库接口(由T4模板生成).它有31个IQueryables,31个Save超载和31个Delete重载.MyAbstractRepository是一个部分抽象类.它声明了相同的3 x 31方法.

如果我删除所有保存和删除方法,只留下31个IQueryables并且不注册抽象存储库

  container.Register(Component.For<IMyRepository>().Interceptors<Interceptor>());
Run Code Online (Sandbox Code Playgroud)

我仍然在第一代运行大约250毫秒.

这是一台非常(非常非常)快速的机器......所以现实世界中的任何东西都可能比上面列出的数字慢.

Luc*_*ero 1

您也许能够在不同的线程中执行代理初始化,以便应用程序本身可以在生成代理时继续初始化。考虑将其排队到线程池中。

另一种选择可能是将代理编译成持久的程序集文件,然后将其保存到磁盘。这样做将显着缩短首次运行后的启动时间。

我不知道为什么 Castle 的动态代理需要这么长时间才能初始化。我不使用它们,我通常直接发出代码(作为简单方法的 LCG,以及通过完整的 Reflection.Emit 实现完整的实现)。即使生成数百个 LCG 方法,我也从未遇到过这么长时间的延迟。也许使用不同的方法/库(LinFu 等)也可以解决这个问题。