From 864ace1845b20a60cc3cf38c6e4341cedca5ce90 Mon Sep 17 00:00:00 2001 From: Rene Gollent Date: Tue, 10 Jun 2008 22:10:13 +0000 Subject: [PATCH] Rework BList's Resize() functionality: instead of altering the size of the list a block at a time, we now double/halve the current size of the list, starting with the constructor blocksize as a baseline. This has the net effect that when doing large numbers of inserts/removes, the number of resize operations needed scales logarithmically to the number of operations, which should yield a decent performance improvement in such cases. Review welcome. This does not yet affect ticket #2363 that I'm aware of, as I'm currently in the process of attempting to find a copy of said app to test with. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25916 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/support/List.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/kits/support/List.cpp b/src/kits/support/List.cpp index c0f1481e19..6424e8ca70 100644 --- a/src/kits/support/List.cpp +++ b/src/kits/support/List.cpp @@ -174,7 +174,7 @@ BList::RemoveItem(int32 index) if (index >= 0 && index < fItemCount) { item = fObjectList[index]; move_items(fObjectList + index + 1, -1, fItemCount - index - 1); - Resize(fItemCount - 1); + Resize(fItemCount - 1); } return item; } @@ -433,11 +433,17 @@ bool BList::Resize(int32 count) { bool result = true; + // calculate the new physical size - int32 newSize = count; - if (newSize <= 0) - newSize = 1; - newSize = ((newSize - 1) / fBlockSize + 1) * fBlockSize; + // by doubling the existing size + // until we can hold at least count items + int32 newSize = fBlockSize; + if (count <= 0) + count = fBlockSize; + if ((size_t)count != fPhysicalSize) + while (newSize < count) + newSize <<= 1; + // resize if necessary if ((size_t)newSize != fPhysicalSize) { void** newObjectList