Listing 1. Ada Equivalent of Java and C++ Program

package Perf_Test is
   type Perf_Test is tagged
      record
         Amount : Integer := 0;
      end record;
   type Perf_Test_Ptr is access Perf_Test'Class;

   procedure Add_Amount (This : Perf_Test_Ptr; Val : in Integer);
   function Get_Amount(This : Perf_Test_Ptr) return Integer;

end Perf_Test;


package body Perf_Test is
  procedure Add_Amount (This : Perf_Test_Ptr; Val: in Integer) is
  begin
     This.Amount := This.Amount + Val;
  end Add_Amount;

  function Get_Amount(This : Perf_Test_Ptr) return Integer is
  begin
     return This.Amount;
  end Get_Amount;

end Perf_Test;


with System.OS_Primitives;
with Ada.Text_Io;

with Perf_Test;

procedure perftest is

   NOBJECTS : Integer := 500000;

   Ptarr : array(1..NOBJECTS) of Perf_Test.Perf_Test_Ptr;

   Sum : Integer :=0;

   Start_Time : Duration;
   End_Time   : Duration;
   Time       : Duration;

begin

   Start_Time := System.OS_Primitives.Clock;

   for I in 1..NOBJECTS loop
      Ptarr(I) := new Perf_Test.Perf_Test;
   end loop;

   for I in 1..NOBJECTS loop
      Perf_Test.Add_Amount(Ptarr(I),I);
   end loop;

   for I in 1..NOBJECTS loop
      Sum := Sum + Perf_Test.Get_Amount(Ptarr(I));
   end loop;

   End_Time := System.OS_Primitives.Clock;

   Time := (End_Time - Start_Time) * 1000;

   Ada.Text_Io.Put_Line("Elapsed time in milliseconds for " &
Integer'Image(NOBJECTS) & " objects: " & duration'Image(Time));
   Ada.Text_Io.Put_Line("Objects per millisecond:" &
Integer'Image(NOBJECTS / Integer(Time)));

end perftest;