Java 程序在特定任务中的性能优于 C 等编译型编程语言。这是因为 JVM 具有运行时信息,并在必要时进行 JIT 编译(我猜)。
(例如:http ://benchmarksgame.alioth.debian.org/u32/performance.php?test=chameneosredux )
编译语言有类似的东西吗?(我首先对C感兴趣)
编译源代码后,开发人员运行它并尝试模仿典型的工作负载。一个工具收集有关运行的信息,然后根据这些数据,它再次重新编译。
Java 程序在特定任务中的性能优于 C 等编译型编程语言。这是因为 JVM 具有运行时信息,并在必要时进行 JIT 编译(我猜)。
(例如:http ://benchmarksgame.alioth.debian.org/u32/performance.php?test=chameneosredux )
编译语言有类似的东西吗?(我首先对C感兴趣)
编译源代码后,开发人员运行它并尝试模仿典型的工作负载。一个工具收集有关运行的信息,然后根据这些数据,它再次重新编译。
gcc有-fprofile-arcs
从手册页:
-fprofile-arcs 添加代码以便检测程序流弧。在执行过程中 程序记录每个分支和调用执行了多少次,执行了多少次 采取或返回的时间。当编译的程序退出时,它会保存这个 将每个源文件的数据保存到一个名为 auxname.gcda 的文件中。数据可能是 用于配置文件导向的优化(-fbranch-probabilities),或 测试覆盖率分析(-ftest-coverage)。
我认为 jvm 从来没有真正击败过优化的 C 代码。
但是要为 c 做类似的事情,您正在寻找配置文件引导优化,其中编译器使用先前运行的运行时信息来重新编译程序。
是的,有一些这样的工具,我认为它被称为“分析器引导的优化”。
有许多优化。重要的是减少后备存储分页以及代码缓存的使用。许多现代处理器都有一个代码缓存,可能是第二级代码缓存,或者第二个统一的数据和代码缓存,可能是第三级缓存。
最简单的做法是将所有最常用的函数移动到可执行文件中的一个位置,比如开头。更复杂的是,将不经常使用的分支移动到文件的某个完全不同的部分。
一些指令集架构(例如 PowerPC)在其机器代码中具有分支预测位。Profiler-guided optimization 尝试更有利地设置这些。
Apple 曾经为 Macintosh Programmer's Workshop 提供这个 - 适用于 Classic Mac OS - 并带有一个名为“MrPlus”的工具。我认为 GCC 可以做到。我希望 LLVM 可以,但我不知道如何。