Registriert seit: 22. Jul 2004
Ort: Münster Osnabrück
116 Beiträge
|
AW: Hashtable, wie benutzen?
24. Apr 2012, 10:10
Hallo,
ich bekomme den Fehler auch nicht hin
Ich habe mal DictFind.pas geändert.
Es wird jetzt eine lineare Liste erzwungen.
Delphi-Quellcode:
function myRandom(i : TDictIntType):TDictIntType;inline;
begin
result := i*ccInitialSize+17;//random(i);
end;
denn alle erzeugten Zahlen Wert sind verschieden, aber (Wert mod ccInitialSize) = 17.
Delphi-Quellcode:
program DictFind;
{$IFDEF FPC}
{$MODE DELPHI}
{$OPTIMIZATION ON}
{$OPTIMIZATION REGVAR}
{$OPTIMIZATION PEEPHOLE}
{$OPTIMIZATION CSE}
{$OPTIMIZATION ASMCSE}
{$ELSE}
{$APPTYPE CONSOLE}
{$ENDIF}
uses
sysutils,csDictionary;
const
LAENGE = 25*1000*1000;
RANDOMRANGE = 1000*100;
// RANDOMRANGE = High(tDictIntType);
type
tArr64 = array of TDictIntType;
var
t1,t0,dt : TDateTime;
Wert : TDictIntType;
dummy : Pointer;
i,j: integer;
A64 : tarr64;
TestHash : TIntegerDictionary;
function myRandom(i : TDictIntType):TDictIntType;inline;
begin
result := i*ccInitialSize+17;//random(i);
end;
BEGIN
randomize;
setlength(A64 ,LAENGE);
TestHash:= TIntegerDictionary.create;
t0 := time;
For i := low(A64) to High(A64) do
Wert := myrandom(i);//random(RANDOMRANGE);
t1 := time;
dt := t1-t0;
Write('Erzeugen von ',LAENGE,' Zufallszahlen [0..',Randomrange-1);
writeln(FormatDateTime('] hh:nn:ss,zzz',dt));
t0 := time;
j := low(A64);
For i := low(A64) to High(A64) do
begin
Wert := myrandom(i);//myrandom(RANDOMRANGE);
IF TestHash.Add(Wert,Pointer(j)) then
begin
A64[j] := Wert;
inc(j);
end;
end;
setlength(A64,j);
t1 := time;
Write('TotalCOunt :',TestHash.TotalCount:10);
Write('Einfuegen von ',j,' verschiedenen Daten in ');
writeln(FormatDateTime(' hh:nn:ss,zzz',t1-t0-dt));
For i := low(A64) to 10 do
writeln(i:10,A64[i]:20,TestHash.find(A64[i],dummy):8,integer(dummy):10);
writeln(j-1:10,A64[j-1]:20,TestHash.find(A64[j-1],dummy):8,integer(dummy):10);
t0 := time;
testHash.free;
t1 := time;
Write('Aufloesen der Hashmap in ');
Writeln(FormatDateTime('hh:nn:ss,zzz',t1-t0));
setlength(A64,0);
readln;
END.
Ich erhalte auch so keine Fehlermeldung mit Freepascal 2.6.0 /Win7
Gruß Horst
|
|
Zitat
|