ΠΠΎΠΌΠΏΠ°Π½ΠΈΡ MiΡrosoft ΠΎΡΠΊΡΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΠΎΠ΄ Π»ΠΈΡΠ΅Π½Π·ΠΈΡ MIT Ρ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ°, ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ ΡΡΠ·Π΄Π°Π΄Π΅Π½Π° Π·Π° runtime-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ Π½Π° Π΅Π·ΠΈΡΠΈΡΠ΅ ΠΈ . Mimalloc Π΅ Π°Π΄Π°ΠΏΡΠΈΡΠ°Π½ Π·Π° ΡΠΏΠΎΡΡΠ΅Π±Π° Π² ΡΠΈΠΏΠΎΠ² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡ ΠΎΡ ΠΏΡΠΎΠΌΡΠ½Π° Π½Π° ΡΠ΅Ρ Π½ΠΈΡ ΠΊΠΎΠ΄ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ»ΡΠΆΠΈ ΠΊΠ°ΡΠΎ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½ΠΎ Π·Π°ΠΌΠ΅ΡΡΠΈΡΠ΅Π» Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° malloc. ΠΠΎΠ΄ΠΊΡΠ΅ΠΏΡ ΡΠ°Π±ΠΎΡΠ° Π² Windows, macOS, Linux, BSD ΠΈ Π΄ΡΡΠ³ΠΈ Unix-ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ.
ΠΡΠ½ΠΎΠ²Π½Π°ΡΠ° Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠ° Π½Π° mimalloc Π΅ ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ½ΠΎΡΡΡΠ° Π½Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° (ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΎΡ 3500 ΡΠ΅Π΄Π° ΠΊΠΎΠ΄) ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΠΈΡΠΎΠΊΠ°ΡΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ. Π mimalloc Π½Π°Π΄ΠΌΠΈΠ½Π°Π²Π° ΠΏΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ Π²ΡΠΈΡΠΊΠΈ ΠΊΠΎΠ½ΠΊΡΡΠΈΡΠ°ΡΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π·Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ°, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ , , , ΠΈ .
ΠΠ° ΠΎΡΠ΅Π½ΠΊΠ° Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π½Π°Π±ΠΎΡ ΠΎΡ Π²Π΅ΡΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈ Π Π½ΡΠΊΠΎΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅ mimalloc Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ·ΠΏΡΠ΅Π²Π°ΡΠ²Π° Π΄ΡΡΠ³ΠΈΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π² ΡΠ΅ΡΡΠ° Π·Π° ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ Π½Π° ΠΎΠ±Π΅ΠΊΡΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠΎΡΠΎΡΠΈ mimalloc ΡΠ΅ ΠΎΠΊΠ°Π·Π° ΠΏΠΎ-Π±ΡΡΠ· ΠΎΡ tcmalloc ΠΈ jemalloc Ρ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ 2.5 ΠΏΡΡΠΈ. Π ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΡΠ΅ΡΡΠΎΠ²Π΅ ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ Π½Π°Π±Π»ΡΠ΄Π°Π²Π° ΠΏΠΎ-Π½ΠΈΡΠΊΠ° ΠΊΠΎΠ½ΡΡΠΌΠ°ΡΠΈΡ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ, ΠΊΠ°ΡΠΎ Π² Π½ΡΠΊΠΎΠΈ ΡΠ»ΡΡΠ°ΠΈ ΡΠ°Π·Ρ ΠΎΠ΄ΠΈΡΠ΅ Π·Π° ΠΏΠ°ΠΌΠ΅Ρ ΡΡΠΏΡΠ²Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π½Π°ΠΌΠ°Π»Π΅Π½ΠΈ Ρ 25%.

ΠΠΈΡΠΎΠΊΠ°ΡΠ° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡ ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΎ ΡΡΠ΅Π· ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ΅Π³ΠΌΠ΅Π½ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΏΠΈΡΡΠΊΠ° ΡΡΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ (free list sharding). ΠΠΌΠ΅ΡΡΠΎ Π΅Π΄ΠΈΠ½ Π³ΠΎΠ»ΡΠΌ ΡΠΏΠΈΡΡΠΊ, Π² mimalloc ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅ΡΠΈΡ ΠΎΡ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΈ ΡΠΏΠΈΡΡΡΠΈ, Π²ΡΠ΅ΠΊΠΈ ΠΎΡ ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΡΠ²ΡΡΠ·Π²Π° Ρ ΡΡΡΠ°Π½ΠΈΡΠ° ΠΏΠ°ΠΌΠ΅Ρ. Π’Π°ΠΊΡΠ² ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π½Π°ΠΌΠ°Π»ΡΠ²Π° ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° ΠΈ ΠΏΠΎΠ²ΠΈΡΠ°Π²Π° Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° Π½Π° Π΄Π°Π½Π½ΠΈ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ°. ΠΠΎΠ΄ ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° ΠΏΠ°ΠΌΠ΅Ρ ΡΠ΅ ΡΠ°Π·Π±ΠΈΡΠ° Π³ΡΡΠΏΠ° ΠΎΡ Π±Π»ΠΈΠ·ΠΊΠΈ ΠΏΠΎ ΡΠ°Π·ΠΌΠ΅Ρ Π±Π»ΠΎΠΊΠΎΠ²Π΅. ΠΠ° 64-Π±ΠΈΡΠΎΠ²ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ ΡΠ°Π·ΠΌΠ΅ΡΡΡ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ Π΅ 64 ΠΠ. Π ΡΠ»ΡΡΠ°ΠΉ, ΡΠ΅ Π² ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° Π½Π΅ ΠΎΡΡΠ°Π²Π°Ρ Π·Π°Π΅ΡΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅, ΡΡ ΡΠ΅ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π° Π½Π°ΠΏΡΠ»Π½ΠΎ Ρ Π²ΡΡΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ° Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ°Π»ΡΡ ΡΠ°Π·Ρ ΠΎΠ΄ΠΈΡΠ΅ Π·Π° ΠΏΠ°ΠΌΠ΅Ρ ΠΈ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° Π² Π΄ΡΠ»Π³ΠΎΡΡΠΎΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ΅ΡΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ.
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΠ²ΡΡΠ·Π°Π½Π° Π½Π° Π΅ΡΠ°ΠΏΠ° Π½Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ ΠΈΠ»ΠΈ Π΄Π° Π±ΡΠ΄Π΅ Π·Π°ΡΠ΅Π΄Π΅Π½Π° Π·Π° Π²Π΅ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° (Β«LD_PRELOAD=/usr/bin/libmimalloc.so myprogramΒ»). Π Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π·Π° ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡΠΈ Π² runtime ΠΈ ΠΏΡΠ΅ΡΠΈΠ·Π½ΠΎΡΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΡΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° ΡΠ²ΡΡΠ·Π²Π°Π½Π΅ Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΡΠΈ Π·Π° ΠΎΡΠ»ΠΎΠΆΠ΅Π½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ° ΠΈ ΠΌΠΎΠ½ΠΎΡΠΎΠ½Π½ΠΎ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° Π±ΡΠΎΡΡΠΈ Π·Π° ΠΏΡΠ΅ΠΏΡΠ°ΡΠΊΠΈ. ΠΠΌΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Β«ΠΊΡΠΏΡΠΈΠ½ΠΈΒ» (heap) Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π·Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΎΠ±Π»Π°ΡΡΠΈ Π½Π° ΠΏΠ°ΠΌΠ΅ΡΡΠ°. ΠΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΡΠΏΡΠΈΠ½Π°ΡΠ° Π½Π°ΠΏΡΠ»Π½ΠΎ, Π±Π΅Π· ΠΎΠ±Ρ ΠΎΠΆΠ΄Π°Π½Π΅ ΠΈ ΠΎΡΠ΄Π΅Π»Π½ΠΎ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠ΅ ΡΠ°ΠΌ ΠΎΠ±Π΅ΠΊΡΠΈ.
ΠΡΠ΅Π΄Π²ΠΈΠ΄Π΅Π½Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° Π² Π·Π°ΡΠΈΡΠ΅Π½ ΡΠ΅ΠΆΠΈΠΌ, ΠΏΡΠΈ ΠΊΠΎΠΉΡΠΎ Π½Π° Π³ΡΠ°Π½ΠΈΡΠ°ΡΠ° Π½Π° Π±Π»ΠΎΠΊΠΎΠ²Π΅ΡΠ΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π·Π°ΠΌΡΠ½Π° Ρ ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π½ΠΈ ΡΡΡΠ°Π½ΠΈΡΠΈ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ° (guard-page), Π° ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ°Π½Π΄ΠΎΠΌΠΈΠ·Π°ΡΠΈΡ Π·Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° Π±Π»ΠΎΠΊΠΎΠ²Π΅ΡΠ΅ ΠΈ ΠΊΡΠΈΠΏΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΏΠΈΡΡΡΠΈ Ρ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅. ΠΠΎΠ΄ΠΎΠ±Π½ΠΈ ΠΌΠ΅ΡΠΊΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°Ρ Π±Π»ΠΎΠΊΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΡΠΈΠΏΠΈΡΠ½ΠΈ ΡΠ΅Ρ Π½ΠΈΠΊΠΈ Π·Π° Π΅ΠΊΡΠΏΠ»ΠΎΠ°ΡΠ°ΡΠΈΡ Π½Π° ΠΏΡΠ΅Π»ΠΈΠ²Π°Π½Π΅ Π½Π° Π±ΡΡΠ΅ΡΠΈ Π² ΠΊΡΠΏΡΠΈΠ½Π°ΡΠ°. ΠΡΠΈ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°ΡΠΈΡΠ½ΠΈΡ ΡΠ΅ΠΆΠΈΠΌ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΡΠΏΠ°Π΄Π° Ρ ΠΎΠΊΠΎΠ»ΠΎ 3%.
Π‘ΡΠ΅Π΄ ΠΎΡΠΎΠ±Π΅Π½ΠΎΡΡΠΈΡΠ΅ Π½Π° mimalloc ΡΠ΅ ΠΎΡΠ±Π΅Π»ΡΠ·Π²Π°, ΡΠ΅ Π½Π΅ Π΅ ΠΏΠΎΠ΄Π»ΠΎΠΆΠ΅Π½ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ ΡΠ°Π·Π΄ΡΠ²Π°Π½Π΅ΡΠΎ ΠΏΡΠΈ Π³ΠΎΠ»ΡΠΌΠ° ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ. Π Π½Π°ΠΉ-Π»ΠΎΡΠΈΡ ΡΡΠ΅Π½Π°ΡΠΈΠΉ ΠΏΠΎΡΡΠ΅Π±Π»Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ Π½Π°ΡΠ°ΡΡΠ²Π° Ρ 0.2% Π·Π° ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΠΈ ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄ΠΎΡΡΠΈΠ³Π½Π΅ 16.7% Π·Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π°ΡΠ° ΠΏΠ°ΠΌΠ΅Ρ. ΠΠ° ΠΈΠ·ΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΈ ΠΏΡΠΈ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΡΠ΅ΡΡΡΡΠΈ Π² mimalloc ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ ΡΠ°ΠΌΠΎ Π°ΡΠΎΠΌΠ½ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: opennet.ru
