【问题标题】:Speed up compiled programs using runtime information like for example JVM does it?使用运行时信息(例如 JVM)加速编译程序,是吗?
【发布时间】:2014-12-16 12:55:03
【问题描述】:

Java 程序在特定任务中的性能优于 C 等编译型编程语言。这是因为 JVM 有运行时信息,并在必要时进行 JIT 编译(我猜)。

(例如:http://benchmarksgame.alioth.debian.org/u32/performance.php?test=chameneosredux

编译语言有这样的东西吗? (我首先对 C 感兴趣)

编译源代码后,开发人员运行它并尝试模拟典型的工作负载。 一个工具收集有关运行的信息,然后根据这些数据重新编译。

【问题讨论】:

  • 对于编译型语言,它被称为profiling。一些分析器会为您提供可用于手动优化代码的信息,其他分析器可以提供您反馈给编译器的信息,以便它可以做出更好的优化选择。
  • 你有没有一个例子,一个写得好的java程序胜过同样写得好的C程序?
  • 仔细查看示例:在多核上,C gcc #5 程序显示更快的 CPU 时间和已用时间。该 C 程序在单核上会降级,因为该程序正在尝试使用核心亲和性,并且正在与强制将程序置于单核上的测量脚本进行交互。该示例并未显示您的想法。 benchmarksgame.alioth.debian.org/u32q/…

标签: c jvm vm-implementation dynamic-analysis


【解决方案1】:

gcc 有-fprofile-arcs

来自手册页:

-fprofile-arcs 添加代码以便检测程序流弧。在执行过程中 程序记录每个分支和调用执行了多少次,执行了多少次 采取或返回的时间。当编译的程序退出时,它会保存这个 将每个源文件的数据保存到一个名为 auxname.gcda 的文件中。数据可能是 用于配置文件导向的优化(-fbranch-probabilities),或 测试覆盖率分析(-ftest-coverage)。

【讨论】:

【解决方案2】:

我认为 jvm 从来没有真正击败过优化的 C 代码。

但是要为 c 做类似的事情,您正在寻找配置文件引导的优化,其中编译器使用之前运行的运行时信息来重新编译程序。

【讨论】:

    【解决方案3】:

    是的,有一些类似的工具,我认为它被称为“分析器引导的优化”。

    有许多优化。重要的是减少后备存储分页以及代码缓存的使用。许多现代处理器都有一个代码缓存,可能是第二级代码缓存,或者是第二个统一的数据和代码缓存,可能是第三级缓存。

    最简单的做法是将所有最常用的函数移动到可执行文件中的一个位置,比如开头。更复杂的是,将不常使用的分支移动到文件的某个完全不同的部分。

    某些指令集架构(例如 PowerPC)在其机器代码中具有分支预测位。探查器引导的优化尝试更有利地设置这些。

    Apple 曾经为 Macintosh Programmer's Workshop 提供此功能 - 适用于 Classic Mac OS - 使用名为“MrPlus”的工具。我认为 GCC 可以做到。我希望 LLVM 可以,但我不知道如何。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 2021-06-06
      • 1970-01-01
      • 2012-08-15
      • 2012-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多