为什么这个Java程序比其Ada等效程序快1000倍?

use*_*351 1 java ada

我有两个程序,只需循环十亿次并递增一个整数.我正在计算两个操作并比较两个结果.对于Ada程序,我使用的是GNAT FSF编译器.这两个程序都在Windows上运行.我还尝试运行每个代码的多个并平均测量的持续时间,这显示了相同的结果.

我期望发生两件事情,要么我的Ada程序写得不正确(我对语言很新),要么写得不错,但Java编译器正在对我不知道的代码做些什么的.

这是Ada计划:

with Ada.Text_IO; use Ada.Text_IO;
with Ada.Calendar; use Ada.Calendar;

procedure Main is
    c : Integer := 1;

    startTime, endTime : Time;
    milliS : Duration;
begin
    startTime := Clock;
    while c <= 1000000000 loop
        c := c + 1;
    end loop;

    endTime := Clock;
    milliS := (endTime - startTime) * 1000;

    put_line("Runtime = " & Duration'Image(milliS) & " milliseconds.");
end Main;
Run Code Online (Sandbox Code Playgroud)

和Java代码:

public class Test {

    public static void main(String[] args) {
        int c = 1;
        long start = System.nanoTime();

        while (c<=1000000000) {
            c = c + 1;
        }

        long stop = System.nanoTime();

        float duration = (float) ((start - stop)/1000000.0);
        System.out.println(duration);
    }
}
Run Code Online (Sandbox Code Playgroud)

Ada直接编译机器代码,因此我预计它会比Java程序更快.

Ste*_*n C 10

Java JIT编译器非常智能,可以实现循环优化.它就是这样做的.

如果您修改了Java版本以c在最后打印出right 的值,那么您将获得与(未优化的)Ada版本大致相当的执行时间.如果使用值for c,则无法优化循环1.

Ada直接编译机器代码,因此我预计它会比Java程序更快.

Java JIT编译器也编译为机器代码,但不是立即编译.


1 - 直到我们得到一个无所不知的 JIT编译器,它意识到我们不关注输出:-)