Что касается JAVA, то все написано нма ней самой. В поставке исходники есть. Можно посмотреть.
Вот тут на досуге написал аналогичный тест на паскале. Был озадачен.
Если генерация и сортировка на уговне C и JAVA, то поиск вообще никакой.
Я не дождался пока отработает выборка 10 лимонов элементов. Ограничился 10000. Для сортировки и поиска воспользовался классом TList.
Может я чего не так делаю?
- Код: Выделить всё
program TestPas;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, CustApp
{ you can add units after this };
const
count = 10000000;
D = 1000;
type
{ Test }
Test = class(TCustomApplication)
protected
procedure DoRun; override;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
procedure WriteHelp; virtual;
end;
function IntListCompare(Item1, Item2: Pointer): Integer;
var
I1, I2: LongInt;
begin
I1 := LongInt(Item1^);
I2 := LongInt(Item2^);
if (I1 < I2)
then Result := -1
else if (I1>I2)
then Result := 1
else Result := 0;
End;
{ Test }
procedure Test.DoRun;
var
ErrorMsg: String;
PInt: PLongInt;
I, N: LongInt;
Ar: array of LongInt;
ArList: TList;
Tic0, Tic1, Tic2, Tic3, Tic4, Tic5: TDateTime;
begin
// quick check parameters
ErrorMsg:=CheckOptions('h','help');
if ErrorMsg<>'' then begin
ShowException(Exception.Create(ErrorMsg));
Terminate;
Exit;
end;
// parse parameters
if HasOption('h','help') then begin
WriteHelp;
Terminate;
Exit;
end;
{ add your program here }
WriteLn('1. Fill array size of '+IntToStr(count));
Tic0 := Time;
WriteLn(' Start '+TimeToStr(Tic0));
SetLength(Ar, count);
// Генерация массива случайных целых
ArList := TList.Create;
for I:=0 to count-1 do
begin
Ar[I] := Random(count);
ArList.Add( Addr(Ar[I]) );
End;
Tic1 := Time;
WriteLn(' Stop '+TimeToStr(Tic1));
WriteLn(' Total '+FloatToStrF( (Tic1-Tic0)*100000, ffFixed, 5, 2 )+' sec' );
//for I:=0 to 50 do
// WriteLn('I='+IntToStr(I)+' Value='+IntToStr(Ar[I]));
// Сортировка массива
WriteLn('2. Sort array');
Tic2 := Time;
WriteLn(' Start '+TimeToStr(Tic2));
ArList.Sort(@IntListCompare);
Tic3 := Time;
WriteLn(' Stop '+TimeToStr(Tic3));
WriteLn(' Total '+FloatToStrF( (Tic3-Tic2)*100000, ffFixed, 5, 2 )+' sec' );
//for I:=0 to 50 do
// WriteLn('I='+IntToStr(I)+' Value='+IntToStr(Integer(ArList.Items[I]^)));
// Выборка из сортированного списка
WriteLn('3. Binary search '+IntToStr(count div D)+' items.');
Tic4 := Time;
WriteLn(' Start '+TimeToStr(Tic4));
//for I:=0 to count-1 do // Не дождался :(
for I:=0 to count div D do
begin
N := ArList.IndexOf( Addr(Ar[I]) );
if (N = -1)
then begin
WriteLn('Item index='+IntToStr(I)+' Value='+IntToStr(Ar[I])+' not found!')
End;
End;
Tic5 := Time;
WriteLn(' Stop '+TimeToStr(Tic5));
WriteLn(' Total '+intToStr(D)+' items '+FloatToStrF( (Tic5-Tic4)*100000, ffFixed, 5, 2 )+' sec' );
ArList.Free;
// stop program loop
ReadLn;
Terminate;
end;
constructor Test.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
StopOnException:=True;
end;
destructor Test.Destroy;
begin
inherited Destroy;
end;
procedure Test.WriteHelp;
begin
{ add your help code here }
writeln('Usage: ',ExeName,' -h');
end;
var
Application: Test;
{$IFDEF WINDOWS}{$R TestPas.rc}{$ENDIF}
begin
Application:=Test.Create(nil);
Application.Title:='PAS Test';
Application.Run;
Application.Free;
end.
Ошибка в печати там есть. Вместо
WriteLn(' Total '+intToStr(D)+' items '+FloatToStrF( (Tic5-Tic4)*100000, ffFixed, 5, 2 )+' sec' );
надо
WriteLn(' Total '+intToStr(count div D)+' items '+FloatToStrF( (Tic5-Tic4)*100000, ffFixed, 5, 2 )+' sec' );
У вас нет необходимых прав для просмотра вложений в этом сообщении.