From 1fbcb6e2c03ea892d1cf1f88e240cd600a739788 Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Fri, 30 Oct 2009 19:28:39 +0100 Subject: [PATCH] Added HashTbl::shrink() - but it only be useful in particular situations - for the hashTableTest3, it seemed to slow things down a bit loop 0 - Erased 100000 elements (size 2900000 capacity 4194304) 0.31 s loop 1 - Erased 100000 elements (size 2800000 capacity 4194304) 0.01 s loop 2 - Erased 100000 elements (size 2700000 capacity 4194304) 0 s loop 3 - Erased 100000 elements (size 2600000 capacity 4194304) 0 s loop 4 - Erased 100000 elements (size 2500000 capacity 4194304) 0.01 s loop 5 - Erased 100000 elements (size 2400000 capacity 4194304) 0 s loop 6 - Erased 100000 elements (size 2300000 capacity 4194304) 0 s loop 7 - Erased 100000 elements (size 2200000 capacity 4194304) 0 s loop 8 - Erased 100000 elements (size 2100000 capacity 4194304) 0.01 s loop 9 - Erased 100000 elements (size 2000000 capacity 4194304) 0.44 s loop 10 - Erased 100000 elements (size 1900000 capacity 4194304) 0.44 s loop 11 - Erased 100000 elements (size 1800000 capacity 4194304) 0.39 s loop 12 - Erased 100000 elements (size 1700000 capacity 4194304) 0.4 s loop 13 - Erased 100000 elements (size 1600000 capacity 2097152) 0.15 s loop 14 - Erased 100000 elements (size 1500000 capacity 2097152) 0.01 s loop 15 - Erased 100000 elements (size 1400000 capacity 2097152) 0 s loop 16 - Erased 100000 elements (size 1300000 capacity 2097152) 0 s loop 17 - Erased 100000 elements (size 1200000 capacity 2097152) 0.01 s loop 18 - Erased 100000 elements (size 1100000 capacity 2097152) 0 s loop 19 - Erased 100000 elements (size 1000000 capacity 2097152) 0.27 s loop 20 - Erased 100000 elements (size 900000 capacity 2097152) 0.2 s loop 21 - Erased 100000 elements (size 800000 capacity 1048576) 0.1 s loop 22 - Erased 100000 elements (size 700000 capacity 1048576) 0 s loop 23 - Erased 100000 elements (size 600000 capacity 1048576) 0 s loop 24 - Erased 100000 elements (size 500000 capacity 1048576) 0.12 s loop 25 - Erased 100000 elements (size 400000 capacity 524288) 0.04 s loop 26 - Erased 100000 elements (size 300000 capacity 524288) 0.01 s loop 27 - Erased 100000 elements (size 200000 capacity 262144) 0.02 s loop 28 - Erased 100000 elements (size 100000 capacity 131072) 0.02 s loop 29 - Erased 100000 elements (size 0 capacity 2) 0 s --- applications/test/HashTable3/hashTableTest3.C | 2 ++ .../containers/HashTables/HashTbl/HashTbl.C | 13 +++++++++++++ .../containers/HashTables/HashTbl/HashTbl.H | 3 +++ 3 files changed, 18 insertions(+) diff --git a/applications/test/HashTable3/hashTableTest3.C b/applications/test/HashTable3/hashTableTest3.C index f8d26caf06..910e4f2290 100644 --- a/applications/test/HashTable3/hashTableTest3.C +++ b/applications/test/HashTable3/hashTableTest3.C @@ -74,6 +74,8 @@ int main(int argc, char *argv[]) { map.erase(elemI++); } + + map.shrink(); Info<< "loop " << iLoop << " - Erased " << nBase << " elements" << " (size " << map.size() << " capacity " << map.capacity() << ") " << timer.cpuTimeIncrement() << " s\n"; diff --git a/src/OpenFOAM/containers/HashTables/HashTbl/HashTbl.C b/src/OpenFOAM/containers/HashTables/HashTbl/HashTbl.C index 861f93df11..e6ae7b4ec9 100644 --- a/src/OpenFOAM/containers/HashTables/HashTbl/HashTbl.C +++ b/src/OpenFOAM/containers/HashTables/HashTbl/HashTbl.C @@ -542,6 +542,19 @@ void Foam::HashTbl::clearStorage() } +template +void Foam::HashTbl::shrink() +{ + const label newSize = canonicalSize(nElmts_); + + if (newSize < tableSize_) + { + // avoid having the table disappear on us + resize(newSize ? newSize : 2); + } +} + + template void Foam::HashTbl::transfer(HashTbl& ht) { diff --git a/src/OpenFOAM/containers/HashTables/HashTbl/HashTbl.H b/src/OpenFOAM/containers/HashTables/HashTbl/HashTbl.H index 877f8a1370..ba7b010507 100644 --- a/src/OpenFOAM/containers/HashTables/HashTbl/HashTbl.H +++ b/src/OpenFOAM/containers/HashTables/HashTbl/HashTbl.H @@ -242,6 +242,9 @@ public: // Equivalent to clear() followed by resize(0) void clearStorage(); + //- Shrink the allocated table to approx. twice number of elements + void shrink(); + //- Transfer the contents of the argument table into this table // and annull the argument table. void transfer(HashTbl&);