我有两个程序,只需循环十亿次并递增一个整数.我正在计算两个操作并比较两个结果.对于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编译器,它意识到我们不关注输出:-)