gpt4 book ai didi

c# - 为什么 .net 使用 JIT 编译器而不是只在目标机器上编译一次代码?

转载 作者:IT王子 更新时间:2023-10-29 04:33:32 25 4
gpt4 key购买 nike

标题几乎概括了它,但我想知道为什么像 .net 这样的系统每次运行时都会编译代码,而不是只在目标机器上编译一次?

最佳答案

使用 .NET 或 Java 等中间格式有两个好处:

  1. 您可以在任何平台上运行该程序,这正是因为代码是以中间格式而不是 native 代码表示的。您只需要为中间格式编写一个解释器。
  2. 它允许进行一些在编译时不可能(轻易)实现的运行时优化:例如,您可以利用新 CPU 的特殊功能,即使在您编写程序时这些 CPU 并不存在- 只有 JIT 编译器需要知道这一点。

现在,至于为什么您可能不想在第一次运行时执行编译然后只是缓存它 - 也可能有几个原因。

如果您在启动前编译,那么用户必须在第一次运行时等待更长的时间——在那个时间点,您无法知道用户实际会使用什么。通过只编译你需要的东西,当你需要它时,你可以更快地开始,因为你要做的工作更少,而且你不会存储很多用户永远不会使用的代码(对于大型程序可以是很多代码)。

如果您开始跨 session 缓存 JIT 代码,则需要跟踪已编译的内容,然后将其存储到磁盘。对于大型程序,您可能需要从磁盘加载大量 native 代码。磁盘 I/O 非常昂贵,因此等待磁盘可能比重新 JIT 花费更长的时间。此外,您需要跟踪该缓存的可用时间。如果硬件发生变化,您可能需要重新 JIT 以应用一些新的优化。如果程序发生变化,您将无法使用任何旧的编译代码。如果运行时编译器发生变化,则可能已修复安全错误,您需要重新编译以确保该错误不会保留在您的 native 代码中。

基本上,JIT 编译器突然有更多的工作要做(包括处理缓存的磁盘 I/O)并且变得更加复杂和缓慢,减少了 JIT 的点。

现在,这并不意味着预编译某些程序集有时没有好处,正如 Matthew Ferreira 指出的那样,这正是 ngen 工具可以做的——但在一般情况下,它只是不值得这样做是因为 JIT 编译通常已经足够快了。

关于c# - 为什么 .net 使用 JIT 编译器而不是只在目标机器上编译一次代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3842664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com