IL分析及本地代码提前生成性能分析

来源:互联网 发布:ps4全境封锁网络 编辑:程序博客网 时间:2024/04/27 23:19

        IL提供的最大的优势在于对应用程序的健壮性和安全性。将IL编译成本地CPU指令时,CLR会执行验证过程。这个过程会确保一切都是安全的。比如确保有正确的参数,类型,返回值等等。在Windows中,每个进程都有它自己的虚拟地址空间,这是因为不能简单的信任一个应用程序的代码。一个应用程序完全可能读写一个无效的内存地址。将每个Windows进程都放到一个独立的地址空间,将获得健壮性和稳定性;一个进程无法干扰另一个进程。事实上,CLR提供了在一个操作系统进程中分析多个托管应用程序的能力。每个托管的应用程序都在一个AppDomain中执行。默认情况下,每个托管的EXE文件都在它自己的独立地址空间运行,这个地址空间只有一个AppDomain.

        注意:每当CLR加载一个程序集文件,都会检查是否存在一个对应的NGen生成的本地文件,如果找不到本地的文件,CLR就会像往常那样对IL代码进行JIT编译。如果存在,那么就不要在运行中进行编译。

        我们知道,在程序运行的时候去通过JIT把IL代码编译成本地CPU执行的命令需要时间,那么我们可否提前编译好呢?事实上,我们可以通过.Net Framework提供的NGen.exe工具,将IL代码编译成本地代码,那么CLR的JIT编译器不需要再运行时编译IL代码,那么这样做真的可以提高性能吗?
        在运行的时候,CLR要求访问程序集的元数据,目的是使用类似反射和序列化这样的机制,这就要求同时发布IL和元数据的程序集,而且,当环境某些方面发生了变化,CLR也无法使用NGen生成后的文件。这个时候可能就会进行JIT了,比如CLR版本发生了变化,CPU类型改变了,Windows系统升级了,安全权限更改了...太多的原因可能改变了,那么NGen就会无法使用了,除此之外,生成的NGen文件执行的性能很差,因为编译代码时,NGen无法像JIT编译器那样对最终的执行环节作出许多假设,这样会造成生成较差的代码。例如:NGen不能优化特定CPU指令的使用;讲台字段只能间接访问,而不能直接访问,因为静态字段的实际地址只能在运行时确定。所以有时候效率不一定高。
        NGen新建程序集文件会放到C:\Windows\Assembly\NativeImages_v4.0.#####_64这样一个目录下的一个文件下,在目录名称中,会包含CLR版本号,还会包含是多少位系统版本编译的。

0 0
原创粉丝点击