【问题标题】:How to run a program without JIT?如何在没有 JIT 的情况下运行程序?
【发布时间】:2012-02-15 18:21:44
【问题描述】:

我们如何在没有 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 时如何比较这个程序的性能?

【问题讨论】:

  • 版主说明 我无法通过手术去除噪音大于信号的 cmets,而不会留下完全中断的对话。随后,该问题下的 cmets 已被清除。如果您想就这个问题进行建设性的对话,请使用聊天。如果您有建设性和友好的问题或观点,请随时在此处发布。关键词是建设性的和友好的。

标签: c# java compiler-construction runtime jit


【解决方案1】:

没有 JIT 就无法运行 .NET 代码,即使使用 Mono(不再支持其字节码解释器)。

可以为许多 JVM 实现关闭 JIT,例如,-Xint 用于 Sun JVM。

【讨论】:

    【解决方案2】:

    在 .Net 中,您可以在没有 jit 的情况下运行程序,只需先将中间语言预编译为目标机器特定的代码。 NGen 是为 .net 执行此操作的工具。

    根据this post,你可以使用GCJ为java做类似的事情:

    GCJ(GNU Java 编译器)可以将 .class 文件编译成可执行对象,然后可以链接到 .exe 文件,甚至 C++ 文件。当然,最终的 exe / library 最终会带有 GC & Java runtime(静态/动态链接的 .LIB)依赖项。

    【讨论】:

    • 如果我理解正确,@Azodious 希望在 .NET 虚拟机中运行 CIL(而不是先将 CIL 编译为特定于机器的代码,然后再本机执行编译后的代码)。您的消息是完全不同的问题:何时将有 CIL 到特定于机器的代码编译(由 NGen 预先制作或使用 JIT 编译器首次运行)。
    • @penartur 在二读时也许你是对的......在这种情况下,.net 的答案是你不能:)
    • 如果您在调试器下启动代码,jit 是否已停用/相当有限?与将调试器附加到正在运行的进程相比,在调试器下启动生成的代码之间存在很大差异。
    【解决方案3】:

    Oracle JVM 接受 -Djava.compiler=NONE 来禁用 JIT(-D 设置系统属性,java.compiler is the property nameNONE 是值)。不了解 .Net (C#)。

    【讨论】:

      【解决方案4】:

      当代码第一次运行时,它会被解释。只有在运行多次(通常为 10,000 次)后,它才会被编译。对于 CPU 密集型任务,这可能会产生很大的不同。但是,对于 IO 密集型任务,您拥有的操作系​​统和硬件会产生更大的影响。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-10-26
        • 1970-01-01
        • 2016-03-22
        • 2012-04-29
        • 2012-11-13
        • 1970-01-01
        • 2010-11-20
        • 1970-01-01
        相关资源
        最近更新 更多