.NET使用JIT(即时)编译技术。这意味着它首先将源代码编译为MSIL(中间语言)并创建EXE,然后在运行时将IL转换为机器代码。它工作正常,但整个编译的代码没有加载到缓存中,它一次又一次地编译所有的功能和过程。我的应用程序非常时间敏感。发生的事情是,当我非常频繁地调用某个特定函数时,通过do while循环说,该函数在10微秒内执行。但是相同的功能,如果在100毫秒或更长的间隔后调用,则执行需要50-60微秒。我希望一些特定的函数/过程始终保留在缓存中。任何人都可以指导吗?我认为这是因为JIT而发生的。我们可以关闭JIT并将代码直接编译成机器语言或其他东西吗?请帮忙。
答案 0 :(得分:3)
一旦函数第一次被JIT,它就会在进程运行时永远忘记。由于IL到本机编译,这是唯一可能需要更长时间的第一次调用。最糟糕的情况是,如果系统内存不足,本机代码可能会被换出。
您可以通过运行ngen
并将预编译的本机映像放在GAC中来跳过JIT编译,尽管不会是您问题的解决方案。如果你的代码是如此时间关键,50-60 usec会产生差异,你不应该首先使用.NET - 不是因为JIT,而是因为GC可能在任何时候由任何托管线程虚拟触发
答案 1 :(得分:1)
不,你不能关闭JIT,因为.NET没有“解释”IL。它必须编译为机器代码,这是由JITter完成的。
你可以做的是预编译它。这是通过ngen完成的。见http://msdn.microsoft.com/en-us/magazine/cc163610.aspx