Răsfoiți Sursa

* reduced memory usage by about 10% and increased speed by about 15%

Jonas Maebe 24 ani în urmă
părinte
comite
9b628f6409
1 a modificat fișierele cu 49 adăugiri și 9 ștergeri
  1. 49 9
      compiler/cclasses.pas

+ 49 - 9
compiler/cclasses.pas

@@ -141,8 +141,8 @@ interface
 ********************************************}
 
     const
-       { the real size will be [-hasharray..hasharray] ! }
-       hasharraysize = 2047;
+       { the real size will be [0..hasharray-1] ! }
+       hasharraysize = 512;
 
     type
        { namedindexobect for use with dictionary and indexarray }
@@ -175,7 +175,7 @@ interface
        end;
 
        Pdictionaryhasharray=^Tdictionaryhasharray;
-       Tdictionaryhasharray=array[-hasharraysize..hasharraysize] of TNamedIndexItem;
+       Tdictionaryhasharray=array[0..hasharraysize-1] of TNamedIndexItem;
 
        TnamedIndexCallback = procedure(p:TNamedIndexItem) of object;
        TnamedIndexStaticCallback = procedure(p:TNamedIndexItem);
@@ -885,12 +885,49 @@ end;
       end;
 
 
+    function counttree(p: tnamedindexitem): longint;
+      begin
+        if not assigned(p) then
+          exit(0);
+        result := 1;
+        inc(result,counttree(p.fleft));
+        inc(result,counttree(p.fright));
+      end;
+
     destructor Tdictionary.destroy;
+{$ifdef hashdebug}
+      var
+        i, unused, slots_with_col, collissions, treecount, maxcol: longint;
+{$endif hashdebug}        
       begin
         if not noclear then
          clear;
         if assigned(FHashArray) then
-         dispose(FHashArray);
+         begin
+{$ifdef hashdebug}
+           unused := 0;
+           collissions := 0;
+           maxcol := 0;
+           slots_with_col := 0;
+           for i := low(fhasharray^) to high(fhasharray^) do
+             if assigned(fhasharray^[i]) then
+               begin
+                 treecount := counttree(fhasharray^[i]);
+                 inc(collissions,sqr(treecount-1));
+                 if treecount > maxcol then
+                   maxcol := treecount;
+                 inc(slots_with_col,ord(treecount>1));
+               end
+             else
+               inc(unused);
+           writeln('Slots unused: ',unused,' out of ',hasharraysize,
+             ' (',slots_with_col,' with >1 items)');
+           writeln('Mean number of collissions: ',
+             (sqrt(collissions / extended(hasharraysize-1))):0:3,' (max: ',maxcol,')');
+           writeln;
+{$endif hashdebug}
+           dispose(FHashArray);
+         end;
       end;
 
 
@@ -912,7 +949,7 @@ end;
         if assigned(FRoot) then
           cleartree(FRoot);
         if assigned(FHashArray) then
-         for w:=-hasharraysize to hasharraysize do
+         for w:= low(FHashArray^) to high(FHashArray^) do
           if assigned(FHashArray^[w]) then
            cleartree(FHashArray^[w]);
       end;
@@ -1046,7 +1083,7 @@ end;
         if assigned(FHashArray) then
          begin
            empty:=false;
-           for w:=-hasharraysize to hasharraysize do
+           for w:=low(FHashArray^) to high(FHashArray^) do
             if assigned(FHashArray^[w]) then
              exit;
            empty:=true;
@@ -1072,7 +1109,7 @@ end;
       begin
         if assigned(FHashArray) then
          begin
-           for i:=-hasharraysize to hasharraysize do
+           for i:=low(FHashArray^) to high(FHashArray^) do
             if assigned(FHashArray^[i]) then
              a(FHashArray^[i]);
          end
@@ -1098,7 +1135,7 @@ end;
       begin
         if assigned(FHashArray) then
          begin
-           for i:=-hasharraysize to hasharraysize do
+           for i:=low(FHashArray^) to high(FHashArray^) do
             if assigned(FHashArray^[i]) then
              a(FHashArray^[i]);
          end
@@ -1738,7 +1775,10 @@ end;
 end.
 {
   $Log$
-  Revision 1.7  2001-05-04 19:50:04  peter
+  Revision 1.8  2001-11-05 14:16:25  jonas
+    * reduced memory usage by about 10% and increased speed by about 15%
+
+  Revision 1.7  2001/05/04 19:50:04  peter
     * fixed dynamicarray.seek() with pos equals multiple of $10000
 
   Revision 1.6  2001/04/13 01:22:06  peter