C#学习教程:预加载所有组件(JIT)我们的项目分为一个主要的可执行文件和几个DLL文件。DLL文件还可以包含UI屏幕,第一次加载速度很慢。有没有一种方法(在代码中)可以预加载所有引用的程序集以避免JIT编译命中?我知道有一个工具叫做NGen。是否可以在开发环境中运行NGen,以便我们可以立即看到它的影响?但理想情况下,我们希望从代码中预加载引用的程序集。将C#.NET3.5和DevExpress用于UI组件。你试过/检查过这个吗?也就是说,对每个要预JIT的程序集执行以下操作。staticvoidPreJIT(){foreach(vartypeinAssembly.GetExecutingAssembly().GetTypes()){foreach(vartypeintype.GetMethods(BindingFlags.DeclaredOnly|BindingFlags.NonPublic|BindingFlags.Public|BindingFlags.Instance|BindingtaFlags.)){System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod(method.MethodHandle);}}}查看NGen。另一种选择是使用ILMerge将所有程序集合并为一个。每当我使用ILMerge时,我都会添加一个构建后命令,以便它自动发生。另一个选项(未测试)是,如果您不介意更长的启动时间,您可以在每个程序集开始时手动调用Assembly.Load()。就我个人而言,我发现将预抖动放在“程序”中有助于某个应用程序,但这是一个特定于案例的问题。更何况wal的answer里的代码遇到抽象方法就崩溃了,所以加了两行代码跳过抽象方法。staticProgram(){foreach(vartypeinAssembly.GetExecutingAssembly().GetTypes()){foreach(vartypeintype.GetMethods(BindingFlags.DeclaredOnly|BindingFlags.NonPublic|BindingFlags.Public|BindingFlags.Instance|BindingFlags.Static)){如果((method.Attributes&MethodAttributes.Abstract)==MethodAttributes.Abstract||method.ContainsGenericParameters){继续;}System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod(method.MethodHandle);}}Console.WriteLine("jitted!");您可以只创建位于外部程序集中的类的实例。只需在有限范围内调用构造函数(我的意思是在函数内部声明变量。它不应该是全局变量,因为它会延迟GC处理该实例)。这将加载程序集,编译它并缓存它。您甚至可以在后台线程中执行此操作,以便主线程保持响应。您可以在任何机器上使用NGen-CLR中没有“开发环境”的概念......当您使用它时,请确保您实际使用NGen的图像(请参阅本机图像生成器(Ngen.exe)了解描述和外观文档FusLogVw注释)。您也可以通过调用您希望运行的所有代码(如Davita所建议的那样)来进行预JIT,但是您需要调用所有类的每个方法,这并不实际。您应该分析您的应用程序以查看它实际花费了多长时间——它可能是从磁盘读取程序集,而不是JIT本身……您可以通过启动应用程序、查看表单、关闭应用程序和重复速度来粗略地查看它。如果第二次运行快得多,那么应用程序大部分时间都在从磁盘读取数据,而不是JITing。以上就是C#学习教程:预加载所有组件共享的所有内容(JIT)。侵权请点击右侧联系管理员删除。如需转载请注明出处:
