wine/dlls/kernel32
Tatsuyuki Ishi a612ab6f2a ntdll: Use log-linear bucketing for free lists.
Currently, the free list consists of a "small list" for sizes below 256,
which are linearly spaced, and a "large list" which is manually split
into a few chunks.

This patch replaces it with a single log-linear policy, while expanding
the range the large list covers.

The old implementation had issues when a lot of large allocations
happened. In this case, all the allocations went in the last catch-all
bucket in the "large list", and what happens is:
1. The linked list grew in size over time, causing searching cost to
   skyrocket.
2. With the first-fit allocation policy, fragmentation was also making
   the problem worse.

The new bucketing covers the entire range up until we start allocating
large blocks, which will not enter the free list. It also makes the
allocation policy closer to best-fit (although not exactly), reducing
fragmentation.

The increase in number of free lists does incur some cost when it needs
to be skipped over, but the improvement in allocation performance
outweighs it.

For future work, these ideas (mostly from glibc) might or might not
benefit performance:
- Use an exact best-fit allocation policy.
- Add a bitmap for freelist, allowing empty lists to be skipped with a
  single bit scan.

Signed-off-by: Tatsuyuki Ishi <ishitatsuyuki@gmail.com>
2023-04-12 12:03:51 +02:00
..
tests ntdll: Use log-linear bucketing for free lists. 2023-04-12 12:03:51 +02:00
atom.c kernel32: Null-terminate the atom names passed to NtAddAtom. 2022-11-04 19:23:55 +01:00
comm.c
computername.c
console.c
debugger.c
file.c
heap.c include: Declare some missing ntdll functions, and fix the sorting. 2023-03-22 20:03:51 +01:00
kernel32.spec kernel32: Add semi-stub for RemoveDirectoryTransactedA/W(). 2023-03-31 19:10:38 +02:00
kernel_main.c
kernel_private.h
locale.c kernel32: Fix GetCurrencyFormatA when input length is 0. 2023-03-08 20:05:14 +01:00
lzexpand.c
Makefile.in
module.c
path.c kernel32: Add semi-stub for RemoveDirectoryTransactedA/W(). 2023-03-31 19:10:38 +02:00
powermgnt.c
process.c kernel32: Implement GetFirmwareType(). 2023-03-06 11:09:03 +01:00
profile.c kernel32/profile: Trim spaces from section names on load. 2022-11-24 09:27:48 +01:00
resource.c
sync.c
tape.c
thread.c
toolhelp.c
version.c
version.rc
virtual.c
volume.c