C#的可执行程序每一次运行时都要进行即时编译吗?注是指完全退出程序后再次执行这个EXE文件还要对IL进行即时编译为本地代码吗? 有篇文章这么说内容如下:
再次调用该方法?
在一个程序中,我们经常反复调用同一个方法,当再次调用该方法时就不需要重复进行验证了,可以直接调用内存块中已有的本地代码,完全跳过JITCompile函数的验证和编译过程。所以同一方法只有在第一次调用时会产生一些性能损失,后续调用就可以全速进行了。
关闭程序?
由于编译器将本地代码保存在动态内存中,所以关闭程序时本地代码将发生丢失。当再次启动程序或者同时运行程序的两个实例时,JIT编译器将再次将IL代码编译为本地指令。
有个网友又说不用再次编译为本地指令,他是这么说:
公共语言运行库支持一种提前编译模式。此提前编译模式使用本机映像生成器 (Ngen.exe) 将 MSIL 程序集转换为本机代码,其作用与 JIT 编译器极为相似。但是,Ngen.exe 的操作与 JIT 编译器的操作有三点不同:它在应用程序运行之前而不是运行过程中执行从 MSIL 到本机代码的转换。它一次编译一个整个的程序集,而不是一次编译一个方法。它将本机映像缓存中生成的代码以文件的形式持久保存在磁盘上。现在我也不知道哪个正确答案!
再次调用该方法?
在一个程序中,我们经常反复调用同一个方法,当再次调用该方法时就不需要重复进行验证了,可以直接调用内存块中已有的本地代码,完全跳过JITCompile函数的验证和编译过程。所以同一方法只有在第一次调用时会产生一些性能损失,后续调用就可以全速进行了。
关闭程序?
由于编译器将本地代码保存在动态内存中,所以关闭程序时本地代码将发生丢失。当再次启动程序或者同时运行程序的两个实例时,JIT编译器将再次将IL代码编译为本地指令。
有个网友又说不用再次编译为本地指令,他是这么说:
公共语言运行库支持一种提前编译模式。此提前编译模式使用本机映像生成器 (Ngen.exe) 将 MSIL 程序集转换为本机代码,其作用与 JIT 编译器极为相似。但是,Ngen.exe 的操作与 JIT 编译器的操作有三点不同:它在应用程序运行之前而不是运行过程中执行从 MSIL 到本机代码的转换。它一次编译一个整个的程序集,而不是一次编译一个方法。它将本机映像缓存中生成的代码以文件的形式持久保存在磁盘上。现在我也不知道哪个正确答案!
解决方案 »
- Java的一个方法,如果在C#实现
- C# TCP通信问题
- 多个ComboBox绑定同一个数据源后,当其中一个选项改变时,其它的也跟着改变了
- 求DataGrid (Winform)控件
- 在VS2005C#中如何调用PROLOG编写的DLL
- 从windows服务中显示form窗体
- 想写一个MDI窗体,窗体的下面有一个类似于任务栏的Bar,有什么控件可以实现吗?
- winform 中datagrid为什么不能显示数据
- C#里如何完全关闭Tcp连接
- c#开发winform程序,让winform象qq一样可以自动隐藏,在用鼠标靠近时又可以显示出来!
- 小白求问,在windows下有没有一个API来判断耳机是否插入电脑?
- 【求助】C#中对XML中某个节点修改后SAVE了,但并没有更新文件
MSIL编译为本机代码运行 Microsoft 中间语言 (MSIL) 之前,必须先根据公共语言运行库将其编译为适合目标计算机体系结构的本机代码。.NET Framework 提供了两种方式来执行此类转换:.NET Framework 实时 (JIT) 编译器。.NET Framework 本机映像生成器 (Ngen.exe)。