是有情况JIT编译器快于其他汇编者像C++?

你认为在未来JIT编译器只会看到微小的优化、特征,但遵循类似的性能,或者会不会有突破,这将使它无限优于其他汇编者?

它看起来像多核心模式有一些承诺,但这不是普遍的魔法。

任何见解?

有帮助吗?

解决方案

是的,一定有这样的情况下。

  • JIT汇编可以使用的运行时分析,以优化的具体情况的基础上测量的特点什么样的代码实际上是这样做的时刻,并且可以重新编译"热"的代码是必要的。那不是理论;Java的热点实际上这样做。
  • 焦虑能够优化为具体的CPU和结构在使用上的实际硬件的程序,会发生被执行。例如,许多。网应用程序运行中的32位或64位代码,这取决于他们在哪里JITted.64位硬件,他们将使用更多的寄存器、存储器和更好的指令。
  • 虚拟法调用内部的紧张循环的可替换的静电话的基础上运行的知识类型的参考。

我认为会有突破的未来。特别是,我认为,结合JIT汇编和动态的打字将显着改善。我们已经看到这种在JavaScript空间与铬的V8和TraceMonkey.我希望看到其他改进类似规模在不太遥远的未来。这是重要的,因为甚至所谓的"静态类型的"语言往往有一些动态特点。

其他提示

是,JIT编译可产生用于当前环境而优化的速度更快的机器代码。但是实际上VM程序是不是本机程序慢,因为JIT编译器本身将消耗时间(更优化==更多的时间),并为许多方法JIT编译他们可能比执行它们耗费更多的时间。这就是为什么在GAC .NET介绍

对于JIT编译一个副作用是大的内存消耗。然而,这不是与计算速度,可能整个程序的执行慢下来,因为大的内存消耗增加了你的代码将被调出到二级存储的概率。

对不起我的英文不好。

JIT方面具有优势,但我不认为它接管完全。传统的编译器可以花更多的时间来优化,而JIT需要打太多优化之间的平衡(以比由优化节省更多的时间)和过少(花费过多时间在直线执行)。

明显的答案是使用每个在那里它是优越的。 JIT们可以利用的运行时间比传统的优化性能分析更容易(虽然有编译器,可以采取运行时的配置文件作为输入来指导优化),一般有能力做更多的CPU专用的优化(再次,大量的传统编译器做到这一点,但如果你希望运行不同的系统上执行他们不能充分利用的话)。传统的编译器可以花更多的时间,做它用不同的方式。

因此,未来的语言系统将具有良好的优化编译器将发出设计用于通过优化良好的JIT编译器使用的可执行代码。 (这也是对许多人来说,现在的语言系统。)(未来的语言系统也将支持一切从现代的Python / VB脚本来最丑的高速数字运算。)

如同许多事情,这是通过Lisp的预示。前一段时间,一些Lisp的系统(真的不能说很多,再也没有出现过的所有,很多Common Lisp的实现)通过编译它们在飞行中解释Lisp函数。 Lisp的S-表达式(写什么代码)是分析树非常简单描述,所以编译可以去非常快。在此期间,一个优化的Lisp编译器可以紧缩那里表现的时间真的很重要未来的代码。

基本上,JIT编译有机会实际分析的应用程序正在运行,并执行基于该信息的一些提示。 “离线”的编译器将不能够确定一个分支频率跳跃,以及如何往往落空,而无需插入特殊代码,要求开发运行程序,把它通过它的步伐,并重新编译。

为什么这很重要?

//code before
if(errorCondition)
{
  //error handling
}
//code after

被转换成这样的:

//code before
Branch if not error to Code After
//error handling
Code After:
//Code After

和x86处理器不会在没有从分支预测单元信息提前预测一个条件跳转。这意味着,它预测错误处理代码来运行,并且所述处理器将不得不以冲洗管道时,它计算出没有发生错误条件。

一个JIT编译器可以看到的是,并插入一个提示的分支,从而使CPU将在正确方向预测。诚然,离线编译器可以构建的方式,将避免错误预测的代码,但如果你需要看的组装,你可能不喜欢它跳来跳去到处....

这是在此对话跳过另一件事是,你JIT一段代码时,它可被编译以在存储器中的自由点。在像C语言++如果DLL是基于使得一块内存不存在,它必须要经过垫底的昂贵的过程。这是更快的JIT代码到未使用的地址,然后变基编译DLL成为自由的存储空间。更糟糕的是,一个重建基础DLL不能共享。 (请参见 http://msdn.microsoft.com/en-us/magazine/ cc163610.aspx

我还没有非常深刻的印象与一些优化在C#3.5 JIT代码。像位操作简单的事情,需要压缩的效率极其低下(它拒绝缓存值,在CPU寄存器,而是去记忆每个操作)。我不知道为什么会这样,但它使一个巨大的差异并没有什么我可以做的。

我个人认为,一个良好的解决方案将是一个优化级别(1-100),你可以设置为告诉JIT编译器多少时间,你认为它应该花在优化代码。唯一的其他解决方案将是一个AOT编译器(提前),然后你失去很多的JIT代码的优点。

很多人也许我略读(也许我有坚持错误的结束)回答但对我来说,他们是两个不同的东西:

AFAIK没有什么阻止你JIT'ing编译的C ++例如项目手摇JIT'ed机器代码:

http://arstechnica.com/reviews/1q00/dynamo/dynamo- 1.HTML

和它没有提供实际速度的提高在某些情况下。

编译代码,在C ++编译器的意义上意味着采取的语言编写的代码,并把它变成一组指令(或在某些情况下,然后被再次编译另一种语言),其可以通过某种逻辑来执行装置

e.g。 C ++编译成汇编(我认为;-) 或C#编译成IL 或Java编译成字节码

JIT是执行期间发生的过程。执行代码的机器分析它,看它是否能改善它。 Java和C#都能够利用双方的,因为编译器准备命令为VM,然后将虚拟机有机会至少有另一个去优化它。

有些程序不编译他们解释,这意味着运行这些读你写的确切码的机器。这些机器有oppourtunity做一些JIT,但要记住,他们也可以静态编译,有可能是该语言的原始设计者从未想过的方式第三方供应商。

因此,要回答你的问题,我不认为JIT将取代静态编译器。我想总会(只要有规划至少)是采用一个程序的表示和转换是成组指令某种类型的机器的地方。 (潜在地优化而它的话)

不过,我认为,JIT可以成为故事中更大的一部分,作为Java运行时和.NET运行时间变化,我相信JIT会得到这样的项目迪纳摩更好,给东西我想有余地硬件占用了JIT了,所以一切你的处理器确实是重新优化基于运行时环境。

的JIT编译器知道更多的系统的再静态编译器。到机器特定飞添加multitheading可以是一个巨大的速度提升,一旦他们得到它的工作。

在一般

的JIT编译器有一个位启动延迟的该程序/代码的第一次运行可以是慢然后预编译代码。冷起动缺点。

JIT编译的另一大优势是,经过你的程序已经建立,并获得新的编译器的技巧,而不需要一个完整的新程序部署的编译器可以进行更新。

JIT编译的一个优点,其尚未被提及的是,有可能为一个程序来定义一般类型的无限数量。例如:

interface IGenericAction { bool Act<T>(); }

struct Blah<T>
{
  public static void ActUpon(IGenericAction action)
  {
     if (action.Act<T>())
       Blah<Blah<T>>.ActUpon(action);
  }
}

调用Blah<Int32>.ActUpon(act)将调用act.Act<Int32>()。如果该方法返回true,它会调用Blah<Blah<Int32>>.ActUpon(act),这将反过来调用act.Act<Blah<Int32>>()。如果返回true,更多的呼叫将更加-深度嵌套式进行。生成的代码为所有ActUpon方法可以的被称为是不可能的,但幸运的是没有必要的。类型不需要生成直到它们被使用。如果action<Blah<...50 levels deep...>>.Act()返回false,则Blah<Blah<...50 levels deep...>>.ActUpon不会叫Blah<Blah<...51 levels deep...>>.ActUpon和后者类型将不需要被创建。

没有提到这有利于“离线”的编译器的一点是,这样的编译器可以有效目标平台与少量的RAM - 甚至少至16个字节。可以肯定,任何甚至远程的PC兼容容易有(字面)数百万次以上,更多的RAM,但我认为这将是一段时间才可以找到的RAM许多兆一台机器的成本低于$ 0.50消耗小于功率的操作过程中一个毫瓦。

请注意的是,16个字节的RAM是不那么微弱因为它的声音,由于具有这样的小RAM芯片在RAM不存储代码 - 具有的存储器中的独立的非易失性区域来保存代码(384字节是我所知道的最小)。这不是一个很大的,当然,但它足以允许$ 0.25处理器执行否则将需要$ 1.00包装值得分立元件的功能。

JIT编译器有他们可以用它来影响优化更多的数据。当然,有人居然又编写代码来使用这些数据,所以它不是一个简单的作为。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top