Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SlottedArray supports 16kb #389

Draft
wants to merge 3 commits into
base: main
Choose a base branch
from
Draft

SlottedArray supports 16kb #389

wants to merge 3 commits into from

Conversation

Scooletz
Copy link
Contributor

@Scooletz Scooletz commented Sep 11, 2024

The aim of this PR is to have a support for 16kb pages. This is done by extracting one more bit from SlottedArray slot for addressing purposes, making it use 14 out of 16 bits in the slot. This requires a few changes:

  1. 0b11 value is now used as a deletion marker, not a marker for a key of length of 5 or more
  2. keys that have 4 nibbles will store one more byte as there's no special case for 4 now. The byte will be 0 to mark a empty key

Benchmarks

Initial benchmarks, probably misaligned in some cases (oddity)

Before

Method nibble sliceFrom length index odd Mean Error StdDev Code Size
EnumerateAll ? ? ? ? ? 720.749 ns 5.3851 ns 5.0372 ns 1,883 B
EnumerateNibble 0 ? ? ? ? 245.012 ns 3.5559 ns 3.3262 ns 1,939 B
Prepare_Key ? 0 0 ? ? 2.175 ns 0.0311 ns 0.0291 ns 718 B
Prepare_Key ? 0 1 ? ? 1.515 ns 0.0221 ns 0.0207 ns 715 B
Prepare_Key ? 0 2 ? ? 1.461 ns 0.0180 ns 0.0159 ns 715 B
Prepare_Key ? 0 3 ? ? 1.592 ns 0.0242 ns 0.0226 ns 715 B
Prepare_Key ? 0 4 ? ? 1.596 ns 0.0396 ns 0.0371 ns 715 B
Prepare_Key ? 0 6 ? ? 3.108 ns 0.0226 ns 0.0200 ns 742 B
Prepare_Key ? 0 32 ? ? 3.117 ns 0.0367 ns 0.0344 ns 742 B
TryGet_With_Hash_Collisions ? ? ? 1 ? 19.954 ns 0.1780 ns 0.1665 ns 5,760 B
EnumerateNibble 1 ? ? ? ? 244.702 ns 1.6471 ns 1.5407 ns 1,932 B
Prepare_Key ? 1 1 ? ? 1.514 ns 0.0226 ns 0.0211 ns 715 B
Prepare_Key ? 1 2 ? ? 1.586 ns 0.0124 ns 0.0110 ns 712 B
Prepare_Key ? 1 3 ? ? 1.577 ns 0.0171 ns 0.0160 ns 715 B
Prepare_Key ? 1 4 ? ? 1.745 ns 0.0314 ns 0.0294 ns 719 B
Prepare_Key ? 1 6 ? ? 2.820 ns 0.0345 ns 0.0323 ns 694 B
Prepare_Key ? 1 30 ? ? 2.872 ns 0.0388 ns 0.0362 ns 694 B
Prepare_Key ? 1 31 ? ? 2.835 ns 0.0200 ns 0.0187 ns 694 B
TryGet ? ? ? 1 False 7.261 ns 0.0369 ns 0.0327 ns 4,110 B
TryGet_With_Hash_Collisions ? ? ? 2 ? 13.745 ns 0.1249 ns 0.1168 ns 6,000 B
TryGet_With_Hash_Collisions ? ? ? 3 ? 20.180 ns 0.1788 ns 0.1672 ns 5,799 B
TryGet_With_Hash_Collisions ? ? ? 4 ? 13.659 ns 0.0619 ns 0.0579 ns 6,002 B
TryGet ? ? ? 15 False 7.251 ns 0.0635 ns 0.0594 ns 4,132 B
TryGet ? ? ? 16 False 7.691 ns 0.0992 ns 0.0928 ns 4,135 B
TryGet_With_Hash_Collisions ? ? ? 30 ? 14.518 ns 0.1220 ns 0.1141 ns 5,960 B
TryGet ? ? ? 31 False 7.682 ns 0.1516 ns 0.1418 ns 4,118 B
TryGet_With_Hash_Collisions ? ? ? 31 ? 20.093 ns 0.1487 ns 0.1242 ns 5,775 B
TryGet ? ? ? 32 False 7.898 ns 0.0944 ns 0.0883 ns 4,119 B
TryGet ? ? ? 47 False 7.821 ns 0.0814 ns 0.0722 ns 4,128 B
TryGet ? ? ? 48 False 8.107 ns 0.0787 ns 0.0697 ns 4,111 B
TryGet ? ? ? 63 False 8.321 ns 0.1162 ns 0.1087 ns 4,100 B
TryGet ? ? ? 64 False 8.549 ns 0.1079 ns 0.1009 ns 4,116 B
TryGet ? ? ? 95 False 8.908 ns 0.0457 ns 0.0357 ns 4,098 B
TryGet ? ? ? 96 False 9.754 ns 0.1171 ns 0.1095 ns 4,083 B

After

Method nibble sliceFrom length index odd Mean Error StdDev Code Size
EnumerateAll ? ? ? ? ? 1,125.217 ns 17.6967 ns 16.5535 ns 2,357 B
EnumerateNibble 0 ? ? ? ? 294.689 ns 3.9371 ns 3.4902 ns 2,413 B
Prepare_Key ? 0 0 ? ? 2.218 ns 0.0273 ns 0.0256 ns 701 B
Prepare_Key ? 0 1 ? ? 1.458 ns 0.0347 ns 0.0325 ns 698 B
Prepare_Key ? 0 2 ? ? 1.411 ns 0.0234 ns 0.0219 ns 698 B
Prepare_Key ? 0 3 ? ? 1.476 ns 0.0340 ns 0.0318 ns 698 B
Prepare_Key ? 0 4 ? ? 1.502 ns 0.0282 ns 0.0264 ns 698 B
Prepare_Key ? 0 6 ? ? 2.993 ns 0.0414 ns 0.0387 ns 737 B
Prepare_Key ? 0 32 ? ? 2.994 ns 0.0318 ns 0.0298 ns 737 B
TryGet_With_Hash_Collisions ? ? ? 1 ? 20.641 ns 0.1504 ns 0.1333 ns 5,964 B
EnumerateNibble 1 ? ? ? ? 296.856 ns 2.5498 ns 2.3850 ns 2,404 B
Prepare_Key ? 1 1 ? ? 1.457 ns 0.0344 ns 0.0322 ns 698 B
Prepare_Key ? 1 2 ? ? 1.773 ns 0.0295 ns 0.0261 ns 695 B
Prepare_Key ? 1 3 ? ? 1.462 ns 0.0262 ns 0.0245 ns 698 B
Prepare_Key ? 1 4 ? ? 1.783 ns 0.0208 ns 0.0185 ns 702 B
Prepare_Key ? 1 6 ? ? 2.689 ns 0.0100 ns 0.0089 ns 682 B
Prepare_Key ? 1 30 ? ? 2.692 ns 0.0232 ns 0.0217 ns 682 B
Prepare_Key ? 1 31 ? ? 2.747 ns 0.0310 ns 0.0290 ns 682 B
TryGet ? ? ? 1 False 11.075 ns 0.1327 ns 0.1241 ns 5,378 B
TryGet_With_Hash_Collisions ? ? ? 2 ? 14.118 ns 0.0945 ns 0.0884 ns 6,186 B
TryGet_With_Hash_Collisions ? ? ? 3 ? 20.515 ns 0.1693 ns 0.1584 ns 6,022 B
TryGet_With_Hash_Collisions ? ? ? 4 ? 14.110 ns 0.1308 ns 0.1224 ns 6,189 B
TryGet ? ? ? 15 False 11.404 ns 0.1823 ns 0.1705 ns 5,357 B
TryGet ? ? ? 16 False 11.434 ns 0.0877 ns 0.0733 ns 5,376 B
TryGet_With_Hash_Collisions ? ? ? 30 ? 14.763 ns 0.1720 ns 0.1608 ns 6,088 B
TryGet ? ? ? 31 False 11.445 ns 0.1219 ns 0.1140 ns 5,380 B
TryGet_With_Hash_Collisions ? ? ? 31 ? 20.961 ns 0.1016 ns 0.0951 ns 6,040 B
TryGet ? ? ? 32 False 11.657 ns 0.0931 ns 0.0727 ns 5,378 B
TryGet ? ? ? 47 False 11.766 ns 0.1157 ns 0.1082 ns 5,363 B
TryGet ? ? ? 48 False 12.079 ns 0.0768 ns 0.0719 ns 5,365 B
TryGet ? ? ? 63 False 12.079 ns 0.1195 ns 0.1118 ns 5,363 B
TryGet ? ? ? 64 False 12.395 ns 0.2326 ns 0.2176 ns 5,365 B
TryGet ? ? ? 95 False 12.616 ns 0.1003 ns 0.0938 ns 5,365 B
TryGet ? ? ? 96 False 13.314 ns 0.1395 ns 0.1305 ns 5,343 B

@Scooletz Scooletz added 💾 disk size A change makes the disk size smaller 💥Breaking The change introduces a storage breaking change. labels Sep 11, 2024
Copy link

Code Coverage

Package Line Rate Branch Rate Health
Paprika 85% 80%
Summary 85% (4517 / 5311) 80% (1407 / 1761)

Minimum allowed line rate is 75%

@Scooletz
Copy link
Contributor Author

Not the greatest results from benchmarks. Will take a look later on

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
💥Breaking The change introduces a storage breaking change. 💾 disk size A change makes the disk size smaller
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant