如果没有JIT帮助我们如何运行Java或C#程序?
伪代码:
for(int i=0; i<100; i++)
{
// open file in append mode
// remove last line
// add a line
// close the file
// if any exception occurs, continue with next iteration
}
如何在启用/禁用JIT时比较该程序的性能?
答案 0 :(得分:5)
即使使用Mono也不可能在没有JIT的情况下运行.NET代码(不再支持其字节码解释器)。
可以为许多JVM实现关闭JIT,例如,对于Sun JVM,-Xint
。
答案 1 :(得分:3)
在.Net中,只有先将中间语言编译为目标机器特定代码,才能运行没有jit的程序。 NGen是为.net执行此操作的工具。
根据this post,你可以使用GCJ为java做类似的事情:
GCJ(GNU Java编译器)可以将.class文件编译成可执行对象,然后可以将它们链接到.exe文件,甚至是C ++文件。当然,最终的exe /库最终将使用GC&amp; Java运行时(静态/动态链接.LIB)依赖项。
答案 2 :(得分:1)
Oracle JVM接受-Djava.compiler=NONE
以禁用JIT(-D
设置系统属性,java.compiler
is the property name,NONE
是值)。不知道.Net(C#)。
答案 3 :(得分:1)
首次运行代码时,会对其进行解释。只有在它运行多次(通常是10,000次)后才能编译。对于CPU密集型任务,这可能会产生很大的不同。但是,对于IO密集型任务,操作系统和硬件会产生更大的差异。
因此,对于只有100的循环,无论是否启用编译器,都可以确保它不会被编译为本机代码。对于IO密集型任务(以及打开/关闭文件非常昂贵),无论代码是否编译都会产生如此小的差异,您将无法测量它。