在最近关于如何优化某些代码的讨论中,有人告诉我,将代码分解成许多小方法可以显着提高性能,因为JIT编译器不喜欢优化大方法。我对此不确定,因为JIT编译器本身似乎应该能够识别自包含的代码段,无论它们是否在自己的方法中。谁能证实或反驳这一说法? 最佳答案 HotspotJIT仅内联小于某个(可配置)大小的方法。所以使用更小的方法允许更多的内联,这很好。查看thispage上的各种内联选项.编辑稍微详细一点:如果一个方法很小,它将被内联,因此很少有机会因将代码拆分为小方法而受到惩罚。在某些情况下,拆分方法可能会导致更多的内联。示例(如果您
我听说Java必须使用JIT才能快。与解释相比,这非常有意义,但是为什么有人不能制作一个能够生成快速Java代码的提前编译器呢?我知道gcj,但我认为它的输出通常不会比Hotspot快。语言中是否存在使这变得困难的因素?我认为归结为以下几点:反射(reflection)类加载我错过了什么?如果我避免这些功能,是否可以将Java代码编译为原生机器代码并完成? 最佳答案 JIT编译器可以更快,因为机器代码是在它也将在其上执行的确切机器上生成的。这意味着JIT拥有可用于发出优化代码的最佳信息。如果您将字节码预编译为机器码,编译器无法针对目
我听说Java必须使用JIT才能快。与解释相比,这非常有意义,但是为什么有人不能制作一个能够生成快速Java代码的提前编译器呢?我知道gcj,但我认为它的输出通常不会比Hotspot快。语言中是否存在使这变得困难的因素?我认为归结为以下几点:反射(reflection)类加载我错过了什么?如果我避免这些功能,是否可以将Java代码编译为原生机器代码并完成? 最佳答案 JIT编译器可以更快,因为机器代码是在它也将在其上执行的确切机器上生成的。这意味着JIT拥有可用于发出优化代码的最佳信息。如果您将字节码预编译为机器码,编译器无法针对目
标题几乎概括了它,但我想知道为什么像.net这样的系统每次运行时都会编译代码,而不是只在目标机器上编译一次? 最佳答案 使用.NET或Java等中间格式有两个好处:您可以在任何平台上运行该程序,这正是因为代码是以中间格式而不是native代码表示的。您只需要为中间格式编写一个解释器。它允许进行一些在编译时不可能(轻易)实现的运行时优化:例如,您可以利用新CPU的特殊功能,即使在您编写程序时这些CPU并不存在-只有JIT编译器需要知道这一点。现在,至于为什么您可能不想在第一次运行时执行编译然后只是缓存它-也可能有几个原因。如果您在启动
我正在尝试在Unity/Monotouch/C#中为iOS的facebook创建聊天客户端。我收到以下错误ExecutionEngineException:AttemptingtoJITcompilemethod'(wrappermanaged-to-native)System.Threading.Interlocked:CompareExchange(System.EventHandler`1&,System.EventHandler`1,System.EventHandler`1)'whilerunningwith--aot-only.atMatrix.Net.BaseSocket
我目前有一些代码如下所示,它们使用Linq为我组织一些IEnumerable。在处于Release模式(iOS5.0.1、MonoTouch5.0.1、Mono2.10.6.1)的设备上执行此代码时出现异常AttemptingtoJITcompilemethod'System.Linq.OrderedEnumerable`1:GetEnumerator()'whilerunningwith--aot-only.产生这个错误的代码是//ListdocumentsispassedinListgroups=newList();Listcategories=documents.Select(d
我的Android游戏GeoGuess(https://play.google.com/store/apps/details?id=uk.co.quinny898.game.geoguess)native崩溃导致许多设备崩溃全是Java,所以我不明白为什么会发生这种崩溃。崩溃发生在34个不同的设备上(并且还在增加),确实给用户带来了问题(它似乎是在发布时)堆栈轨迹如下:************************************************Buildfingerprint:'samsung/serranoltexx/serranolte:4.4.2/KOT49H
正如我从GoogleIO2010session听说的那样,DalvikJIT编译器只支持ARM处理器。这是否意味着我自己在LinuxX86或MacOSX上构建的Android源代码不支持JIT编译器?我应该使用带有ARM处理器的目标板来测试DalvikJIT编译器吗?谢谢! 最佳答案 我在Linux模拟器上自己检查了一下。JIT使用WITH_JIT=true构建选项。此外,JIT即使在仿真模式下也很有用。Linpack显示使用JIT的性能提高了大约2倍。 关于android-LinuxX
当JustinTime编译器在2.2版中被添加到Android时,许多关于它如何工作的详细信息也被发布了。officialdescriptionofAndroid3.0还提到“对JIT基础设施的各种改进”,但我无法找到有关这些改进的任何信息,也没有找到有关Android4.0中JIT的任何详细信息。JIT在最新版本中是否保持相对不变,或者是否有任何关于这些改进的信息?编辑:正如我在下面的回答中所描述的,我发现了一些描述改进的变更日志条目。任何其他信息仍将不胜感激。 最佳答案 从itspublicGITrepository查看Dalv
这个问题是关于android系统的。DalvikVM使用JIT概念,这意味着当您第一次运行应用程序时,DalvikVM编译它并加载到RAM只要它能留在那里。我理解这个概念。但是名为ART的新虚拟机使用AOT方法。ART在您安装应用程序后(或在安装时?)编译应用程序。这是什么意思?ART编译的应用程序与已编译的应用程序(如C应用程序)相同,但在与操作系统其余部分分开的单独进程中运行?有人可以更彻底地解释我这个概念吗?我必须做一些介绍,这里提到了这一点,但我不理解这个概念,如果有人问我这方面的问题,我不想看起来很愚蠢:)抱歉英语不好,如果有人可以稍微编辑一下问题就好了。