ntdll: Heap implementation has a performance bottleneck

Alexandre Julliard julliard at winehq.org
Fri Jul 21 03:01:23 CDT 2006


Michael Kaufmann <hallo at michael-kaufmann.ch> writes:

> HomeSite's syntax checker needs 120 seconds to load on Wine because of
> Wine's poor heap implementation. Most users will think that the
> program has crashed. I have created a trace of HomeSite's memory
> requests and a program to replay them. For details and performance
> measurements, please look at bug 5709 (
> http://bugs.winehq.org/show_bug.cgi?id=5709 ).

A quick fix is to add more free list entries, and in particular an
entry for very small blocks since your test case seems to create a lot
of them. Something like this seems to work well:

diff --git a/dlls/ntdll/heap.c b/dlls/ntdll/heap.c
index 68a234b..b62c4da 100644
--- a/dlls/ntdll/heap.c
+++ b/dlls/ntdll/heap.c
@@ -88,13 +88,12 @@ #define HEAP_MIN_DATA_SIZE    16
 /* minimum size that must remain to shrink an allocated block */
 #define HEAP_MIN_SHRINK_SIZE  (HEAP_MIN_DATA_SIZE+sizeof(ARENA_FREE))
 
-#define HEAP_NB_FREE_LISTS   4   /* Number of free lists */
-
 /* Max size of the blocks on the free lists */
-static const DWORD HEAP_freeListSizes[HEAP_NB_FREE_LISTS] =
+static const DWORD HEAP_freeListSizes[] =
 {
-    0x20, 0x80, 0x200, ~0UL
+    0x10, 0x20, 0x30, 0x40, 0x60, 0x80, 0x100, 0x200, 0x400, 0x1000, ~0UL
 };
+#define HEAP_NB_FREE_LISTS  (sizeof(HEAP_freeListSizes)/sizeof(HEAP_freeListSizes[0]))
 
 typedef struct
 {

-- 
Alexandre Julliard
julliard at winehq.org



More information about the wine-devel mailing list