Java程序在特定任务中可以胜过像C这样的编译编程语言。这是因为JVM具有运行时信息,并且在必要时进行JIT编译(我猜)。
(例如:http://benchmarksgame.alioth.debian.org/u32/performance.php?test=chameneosredux)
编译语言有这样的东西吗? (我首先对C感兴趣)
编译源代码后,开发人员运行它并尝试模仿典型的工作负载。 工具收集有关运行的信息,然后根据此数据再次重新编译。
答案 0 :(得分:1)
gcc有-fprofile-arcs
来自联机帮助页:
-fprofile-arcs Add code so that program flow arcs are instrumented. During execution the program records how many times each branch and call is executed and how many times it is taken or returns. When the compiled program exits it saves this data to a file called auxname.gcda for each source file. The data may be used for profile-directed optimizations (-fbranch-probabilities), or for test coverage analysis (-ftest-coverage).
答案 1 :(得分:0)
我认为jvm并没有真正打败优秀的C代码。
但是要为c做类似的事情,你正在寻找配置文件引导优化,编译器使用前一次运行的运行时信息来重新编译程序。
答案 2 :(得分:0)
是的,有一些像这样的工具,我认为它被称为“探查器引导优化”。
有许多优化措施。重要的是减少后备存储分页,以及使用代码缓存。许多现代处理器都有一个代码缓存,可能是第二级代码缓存,或者是第二级统一数据和代码缓存,可能是第三级缓存。
最简单的方法是将所有最常用的函数移动到可执行文件中的一个位置,比如在开头。更复杂的是将频繁采用的分支移动到文件的某个完全不同的部分。
某些指令集架构(如PowerPC)在其机器代码中具有分支预测位。 Profiler引导的优化尝试更有利地设置它们。
Apple曾经为Macintosh程序员工作室 - 经典Mac OS - 提供了一个名为“MrPlus”的工具。我认为GCC可以做到。我希望LLVM可以,但我不知道如何。