即时编译与提前编译相比有何优点?

2024-04-16

我最近一直在思考这个问题,在我看来,最大的优势是JIT编译或多或少应该归因于中间格式,而抖动本身并不是生成代码的好方法。

那么主要就是这些pro-JIT我经常听到的编译参数:

  1. 即时编译可实现更大的可移植性。这不是中间格式的原因吗?我的意思是,一旦您将虚拟字节码安装到计算机上,就没有什么可以阻止您将其编译为本机字节码。可移植性是“分发”阶段的问题,而不是“运行”阶段的问题。
  2. 好吧,那么在运行时生成代码呢?嗯,这同样适用。没有什么可以阻止您将真正的即时需求的即时编译器集成到您的本机程序中。
  3. 但运行时无论如何都会将其编译为本机代码一次,并将生成的可执行文件存储在硬盘驱动器上某处的某种缓存中。好,当然。但它在时间限制下优化了你的程序,并且并没有让程序从此变得更好。请参阅下一段。

这不像提前时间编译也没有任何优势。准时制编译有时间限制:您不能让最终用户在程序启动时永远等待,因此需要在某个地方进行权衡。大多数时候,他们只是优化得较少。我的一个朋友有过侧写证据“手动”内联函数和展开循环(在此过程中混淆源代码)对他的性能产生了积极影响C#数字运算程序;在我这边做同样的事情,和我的C程序完成相同的任务,没有产生积极的结果,我相信这是由于我的编译器被允许进行广泛的转换。

然而我们却被紧张不安的程序所包围。C# and Java无处不在,Python 脚本可以编译为某种字节码,而且我确信许多其他编程语言也会这样做。我失踪一定有充分的理由。那么是什么让及时编译如此优于提前时间汇编?


EDIT为了消除一些混乱,也许重要的是要声明我完全支持可执行文件的中间表示。这有很多优点(实际上,大多数争论及时编译实际上是中间表示的参数)。我的问题是如何将它们编译为本机代码。

大多数运行时(或就此而言的编译器)更喜欢即时或提前编译它们。作为提前时间对我来说,编译看起来是一个更好的选择,因为编译器有更多的时间来执行优化,我想知道为什么 Microsoft、Sun 和所有其他公司都采取相反的方式。我对与分析相关的优化有点怀疑,因为我的经验及时编译的程序显示出较差的基本优化。

我使用 C 代码的示例只是因为我需要一个示例提前时间编译与及时汇编。事实是C代码没有发送到中间表示与情况无关,因为我只需要表明提前时间编译可以立即产生更好的结果。


  1. 更大的便携性: 可交付成果(字节码)保留 便携的

  2. 同时,更多的平台特定性:因为 JIT 编译发生在 代码运行的系统相同,它 可以非常非常微调 那个特定的系统。如果你这样做 提前编译(并且仍然 想要将同一个包裹运送到 每个人),你必须妥协。

  3. 编译器技术的改进可能会产生影响 现有的计划。更好的C 编译器根本帮不了你 已部署程序。 A 更好的 JIT 编译器将改善 现有计划的绩效。 您十年前编写的 Java 代码今天将运行得更快。

  4. 适应运行时指标。 JIT 编译器不仅可以查看 代码和目标系统,但是 还包括如何使用代码。它可以 检测正在运行的代码,以及 做出有关如何优化的决定 例如,根据什么 通常对方法参数进行赋值 碰巧有。

你说得对,JIT 会增加启动成本,因此它有时间限制, 而提前编译可能会花费它想要的所有时间。这使得 更适合启动时间不太重要的服务器类型应用程序 在代码变得非常快之前的“预热阶段”是可以接受的。

我想可以将 JIT 编译的结果存储在某个地方,以便下次可以重复使用。这将为您提供第二个程序运行的“提前”编译。也许 Sun 和 Microsoft 的聪明人认为,新的 JIT 已经足够好了,额外的复杂性不值得麻烦。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即时编译与提前编译相比有何优点? 的相关文章

  • 为什么我会收到编译错误“org/codehaus/groovy/control/CompilationFailedException”?

    我正在尝试使用 Ant 脚本和 Java 编译我的 JasperReports 模板 我收到此错误 jasper java lang NoClassDefFoundError org codehaus groovy control Comp
  • 数组“__curl_rule_01__”的大小为负数

    我在尝试编译 GIT 时遇到错误 我已经在 Google 和 GIT 源代码问题 错误中搜索了类似的问题 但没有找到任何可以帮助我的内容 最初我收到以下错误 root teemo usr src git make prefix usr in
  • JIT 编译的代码驻留在哪里?

    所以我有这个方法 用Java编写 public void myMethod int y int x 5 y doSomething x 并假设我的应用程序多次调用此函数 当在Java虚拟机上运行该方法的编译代码时 JVM将首先解释该方法 然
  • 显示构建日期

    我目前有一个应用程序在其标题窗口中显示内部版本号 这很好 但对大多数用户来说没有任何意义 他们想知道他们是否拥有最新版本 他们倾向于将其称为 上周四的 而不是版本 1 0 8 4321 计划是将构建日期放在那里 例如 应用程序构建于 21
  • 使用 ncurses 时未定义对“stdscr”的引用

    我正在尝试在 Ubuntu 11 10 中编译我的代码并收到这些错误等等 到目前为止 通过谷歌搜索我认为这是一个链接错误 具体来说 有人建议确保您拥有正确的标头并链接 lncurses 库 我已经这么做了 我仍然收到此错误 我还读到也许我应
  • Java 应用程序不显示输出

    这是我更新的代码 package car1 公共类主要 公共静态无效主 字符串 args HondaCivic 类实现 car1 int speed 0 int rpm 0 int gear 1 public void speedUp in
  • 程序员多久会被要求编写一个 makefile 文件? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • vaadin gwt 编译器错误未知参数:-war

    我的 vaadin 项目有问题 由于我对 vaadin 相当陌生 所以我不确定如何解决它 我想重新编译我的小部件集 但即使在自定义 Eclipse 之后 我也会收到相同的错误消息 首先它通过命令行执行编译器 接下来它告诉我小部件集是从某个类
  • C 语言的完整 x86/x64 JIT 汇编器

    你知道类似的事情吗this http code google com p asmjit 但是可以嵌入到 C 程序中吗 一些选项 LibJIT http www gnu org software dotgnu GNU闪电 http www g
  • C# 编译器或 JIT 能否优化 lambda 表达式中的方法调用?

    我在开始讨论后开始这个问题 在评论中 https stackoverflow com a 36438566 81179 关于另一个 StackOverflow 问题 我很想知道答案 考虑以下表达式 var objects RequestOb
  • 如何让编译日志在Emacs中创建一个新窗口?

    如果我在 emacs 中只显示一个窗口并使用 M x 编译 则该窗口会一分为二 我可以轻松查看编译缓冲区 但是 如果我显示更多窗口 编译日志就会接管其他窗口之一 这让我感到恼火 如何让emacs始终分割一个新窗口来显示编译日志 编辑 从我一
  • 在 Windows 上从源代码编译 RCurl

    由于没有 Windows 二进制文件v1 95 4 3然而 我需要安装 编译RCurl http cran r project org web packages RCurl index htmlWindows 8 1 上的源代码包 64 位
  • 为什么 WPF 应用程序的默认平台目标是 Visual Studio x86 而不是 AnyCPU?

    当我在 Visual Studio 2012 中创建新的 WPF 应用程序时 平台目标和生成配置默认设置为 x86 为什么会这样呢 对于普通的 WPF 应用程序 没有任何对混合模式程序集的引用 使用 AnyCPU 是否存在任何危险 因此我的
  • 谁将高级语言转换为汇编语言

    好吧 通过计算机指令 程序的基本功能 我了解到我们用高级语言编写源代码 编译器将其转换为低级语言 机器代码 目标代码 我还了解到汇编器将汇编语言转换为机器代码 目标代码 那么我就有以下疑问 如果编译器直接将高级转换为低级 则从生成该汇编语言
  • ldstr 内部实现了 newobj 吗?

    众所周知 字符串是隐式实例化的 这意味着我们不必使用new为了获得对一个对象的引用 正因为如此 我一直相信框架正在处理这个问题 因此如果我这样做 我会得到相同的 IL String first new String new char a s
  • 如何在其他src文件夹中包含头文件

    我有一个 C 项目 有两个 src 文件夹 文件夹1中的源文件可能需要包含src文件夹2中的头文件 这可能吗 或者我应该如何编写我的 Makefile 谢谢 根据两个文件夹的相关程度 例如 如果它们是同一个项目 那么它可以很简单 inclu
  • 如何在命令提示符下运行Java程序

    我创建了一个 Java 项目来调用 Web 服务 它有一个主 java 文件和另一个类文件 我已经为 HTTP 客户端使用了一些 jar 文件 在 Eclipse 中运行良好 我需要通过传递一些参数在命令提示符下运行 Java 程序 在命令
  • 如何从java程序中编译.java文件[重复]

    这个问题在这里已经有答案了 可能的重复 从 Java 内部编译外部 java 文件 https stackoverflow com questions 10889186 compiling external java files from
  • C 和 C++ 编译器何时将浮点型隐式转换或提升为双精度型?

    对于嵌入式项目 我想知道符合标准的 C 编译器 C99 和 C 编译器 C 11 何时最有可能隐式将单浮点变量 值提升为双浮点 我知道有两种情况 不带后缀的文字f 例如 3 14 将浮点数传递给带有可变参数列表的函数 还有其他人吗 那么模板
  • 静态方法是否会立即编译(JIT)?

    根据我的理解 CLR 编译器对实例方法和静态方法的处理方式相同 并且每当首次调用该方法时 IL 代码都会进行 JIT 编译 今天我和同事讨论了 他告诉我静态方法与实例方法的处理方式不同 即 静态方法在程序集加载到应用程序域后立即进行 JIT

随机推荐

  • 无法使用 Visual C++ 编译 allegro

    我刚刚下载了 allegro 库 我创建一个新的空项目 然后添加一个源文件 我添加这行代码 include
  • 安装多个 npm 版本

    是否可以安装多个版本npm对于我正在从事或正在从事的不同项目npm安装总是全局的 Windows 10 还尝试安装不同版本https github com marcelklehr nodist https github com marcel
  • Maven 提供的作用域可以传递吗?

    我有一个祖先依赖项 它具有所提供的依赖范围 我需要将该范围传播到依赖于我的项目的任何内容 例如 假设我有SomeProjectA这取决于SomeLibraryB 我需要确定范围SomeLibraryB已提供 目前编译任何依赖于SomePro
  • 设计用于库存控制的“EAV”或“类/具体表继承”数据库

    我正在为一个建设项目开发库存控制系统 店员负责添加新库存并将其分发给员工 从员工处返还 这些物品 以及它们的属性 将会非常多样化 例如钢制品 服装 设备 机械 工具等 我的问题是是否要去类 具体表继承 https stackoverflow
  • 核心数据对多关系在将对象添加到父实体时创建重复项

    我是 Core Data 和 Objective c 的新手 我正在开发一个项目 从 Web 服务获取 JSON 数据并将其与核心数据同步 我成功地遵循了这个tutorial http www raywenderlich com 15916
  • 用 Java JNA 编写的关键监听器。防止多次回调

    我使用以下代码来监听全局按键事件 Win32HookManager java import com sun jna Pointer import com sun jna platform win32 Kernel32 import com
  • 使用地图计算文本文件中出现的次数

    下面的代码将计算每个字符的出现次数 如果我在文本文件中有 abc 输出将是 a 1 b 1 c 1 我在许多网站上读到 for 循环将花费大量时间 最好使用哈希映射来实现相同的效果 你们中的任何人都可以帮我如何转换这个实现哈希映射的程序吗
  • 对c#的async/await控制流程感到困惑

    我正在学习 async await 并且对 wait 的解释感到困惑MSDN https learn microsoft com en us dotnet csharp language reference keywords await w
  • SSH 连接超时

    我正在尝试使用以下命令建立 SSH 连接golang org x crypto ssh我有点惊讶我似乎不知道如何超时NewSession函数 实际上我没有看到任何超时的方法 当我尝试连接到有问题的服务器时 它会挂起很长时间 我写了一些可以使
  • 您没有浏览服务器的权限?

    我将 kcfinder 与 ckeditor 一起使用 改变的同时disabled to false在 kcfinder 的配置文件中没有问题 但是用以下命令覆盖它 SESSION KCFINDER array disabled gt fa
  • EF Core 中的 AddRange 和 AddRangeAsync 有什么区别

    我正在使用 EF Core 插入条目 我注意到当我调试这行代码时context MyEntityDbSet AddRangeAsync records 加载需要一秒钟 而不是context MyEntityDbset AddRange re
  • 列族 ID 不匹配(发现为 cebcc380-72d4-11e7-9a6b-bd620b945799;预期为 c05d6970-72d4-11e7-9a6b-bd620b945799)

    我该如何解决这个错误列族 ID 不匹配 发现为 cebcc380 72d4 11e7 9a6b bd620b945799 预期为 c05d6970 72d4 11e7 9a6b bd620b945799 Caused by java uti
  • 按多个单词的主题标签拆分术语

    我正在尝试拆分包含多个单词的主题标签的术语 例如 I am great 或 awesome dayofmylife 那么我正在寻找的输出是 I am great awesome day of my life 我所能实现的就是 gt gt g
  • 如何使用java访问SVN中的文件

    我需要你的帮助 我想使用 java 代码从 SVN 打开一个文件 任何人都可以告诉我访问文件的流程 或者任何人都可以向我发送该文件的示例代码 任何人都可以向我发送使用java通过HTML访问svn的示例代码吗 你需要看看SVNKIT Jav
  • CancellationToken 不会在 Azure Functions 中触发

    我有这个简单的 Azure 函数 public static class MyCounter public static int timerRound 0 public static bool isFirst true FunctionNa
  • 如何将我的 app.yaml 迁移到 2.7?

    我正在将我的 gae 应用程序迁移到 python 2 7 这是我的新 app yaml application webfaze version main runtime python27 api version 1 threadsafe
  • 如何修复 ReactforwardRef(Menu) Material UI?

    我创建了非常简单的自定义组件MuiMenu and MuiMenuItem 但是当我尝试显示这些组件时 我看到一个错误 如下所示 Function components cannot be given refs Attempts to ac
  • 如何对歌曲中的专辑进行排序?

    所以我的问题是 当我尝试对专辑进行排序时 专辑标题和专辑艺术是错误的 我尝试对专辑 ID 进行排序 但这并不能解决问题 因为专辑 ID 显然与对艺术进行排序无关 当我忽略排序时 一切都是正确的 但是当我尝试对它们进行排序时 专辑名称与专辑封
  • 更改表的列名后,所有单元和功能测试均出错

    我重命名了表的 3 列 突然我的所有单元和功能测试都抛出了相同的错误 即它们找不到具有旧列名称的表 即使对与我修改的表无关的模型的测试也会抛出相同的错误 Example 54 Error test should show user User
  • 即时编译与提前编译相比有何优点?

    我最近一直在思考这个问题 在我看来 最大的优势是JIT编译或多或少应该归因于中间格式 而抖动本身并不是生成代码的好方法 那么主要就是这些pro JIT我经常听到的编译参数 即时编译可实现更大的可移植性 这不是中间格式的原因吗 我的意思是 一