2012-02-15 127 views
0

我们如何在没有JIT帮助的情况下运行Java或C#程序?如何在没有JIT的情况下运行程序?

伪代码:

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

**主持人笔记** *没有办法可以通过手术去除比信号更多噪音的评论,而不会在我的醒过程中留下完全中断的对话。随后,这个问题下的评论已被清除。如果您想就此问题进行建设性对话,请使用聊天。如果你有建设性和友好的问题或观点,请随时在这里发表。 * – 2012-02-22 10:30:54

回答

4

即使使用Mono(不再支持其字节码解释器),也不可能在没有JIT的情况下运行.NET代码。

对于许多JVM实现,可以关闭JIT,例如Sun JVM的-Xint

3

在.Net中,只有先编译中间语言到目标机器特定代码,才能运行没有jit的程序。 NGen是一个为.net编写的工具。

根据this post可以使用GCJ做的Java类似的东西:

GCJ(GNU的Java编译器),可以将文件编译成的.class然后可以链接到一个.exe文件的可执行的对象,甚至是C++文件。当然,最终的exe /库将以GC运行时(静态/动态链接的.LIB)依赖关系结束。

+0

如果我理解它是正确的,@Azodious想要在.NET虚拟机中运行CIL(而不是先将CIL编译为特定于机器的代码,然后本机执行编译后的代码)。你的信息是完全不同的问题:**当**将CIL转换为机器特定的代码编译(由NGen预先编写或首次使用JIT编译器编译)。 – penartur 2012-02-15 09:30:48

+0

@penartur在二读时也许你是对的......在这种情况下,.net的答案是你不能:) – 2012-02-15 09:33:33

+0

如果你在调试器下启动代码,那么jit是否被禁用/相当有限?与将调试器附加到正在运行的进程相比,在调试器下启动它时生成的代码有很大的区别。 – Voo 2012-02-16 18:58:29

1

当代码第一次运行时,它被解释。只有经过多次运行(通常为10,000次)才会被编译。对于CPU密集型任务,这可以产生很大的差异。但是,对于IO密集型任务,您所使用的操作系统和硬件差异更大。

因此,对于只有100的循环,无论是否启用编译器,都可以确保它不会被编译为本机代码。对于IO密集型任务(并且打开/关闭文件非常昂贵),不管代码是否已编译,都会产生如此小的差异,因此您无法对其进行测量。

相关问题