Skip to content

mimalloc integration - #2708

Open
Vansh-kap-98 wants to merge 2 commits into
sourcemeta:mainfrom
Vansh-kap-98:feature/mimalloc-integration
Open

mimalloc integration#2708
Vansh-kap-98 wants to merge 2 commits into
sourcemeta:mainfrom
Vansh-kap-98:feature/mimalloc-integration

Conversation

@Vansh-kap-98

@Vansh-kap-98 Vansh-kap-98 commented Aug 6, 2026

Copy link
Copy Markdown

Overview

This PR integrates mimalloc as an optional allocator path to significantly improve memory allocation performance during core benchmarking. The default allocator behavior remains unchanged for standard execution, ensuring stability while allowing us to specifically test and leverage mimalloc where intended.

1. Dependency and Vendoring Changes

  • Added mimalloc as a pinned vendored dependency in DEPENDENCIES.
  • Added a dedicated vendor mask file (mimalloc.mask) to strip non-essential upstream content during vendorpull. This keeps the vendored tree minimal for the repository's build use (cmake, include, src, etc.) and avoids carrying extra upstream documentation, tests, or tooling.
  • Hardened vendor-mask line endings to ensure future pulls are perfectly reproducible.

2. Build-System Integration

  • Added a new finder/build wrapper at FindMimalloc.cmake.
  • Configured the module to point to the vendored source directory via MIMALLOC_DIR.
  • Configured mimalloc with the intended options (static build path, tests/object output disabled, override enabled).
  • Utilized add_subdirectory so mimalloc is correctly built by its own upstream CMake logic.
  • Defined an internal alias target Mimalloc::Mimalloc for clean linking by project targets.

3. Results and findings

Aggregate of 10 runs for each, system vs mimalloc, major comparisons are as follows (><5%)

1. Regex Operations

Benchmark Performance Change
Regex_Lower_S_Or_Upper_S_Asterisk +11.4% Improvement
Regex_Caret_Lower_S_Or_Upper_S_Asterisk_Dollar +10.0% Improvement
Regex_Period_Asterisk +9.6% Improvement
Regex_Group_Period_Asterisk_Group +11.0% Improvement
Regex_Period_Plus +11.3% Improvement
Regex_Period +11.4% Improvement
Regex_Caret_Period_Plus_Dollar +11.2% Improvement
Regex_Caret_Group_Period_Plus_Group_Dollar +10.2% Improvement
Regex_Caret_Period_Asterisk_Dollar +49.1% Improvement
Regex_Caret_Group_Period_Asterisk_Group_Dollar +59.7% Improvement
Regex_Caret_X_Hyphen +64.7% Improvement
Regex_Period_Md_Dollar +53.6% Improvement
Regex_Caret_Slash_Period_Asterisk +67.4% Improvement
Regex_Caret_Period_Range_Dollar +56.6% Improvement
Regex_Nested_Backtrack +54.8% Improvement

2. JSON & JSON-LD Operations

Benchmark Performance Change
JSON_Array_Of_Objects_Unique +44.6% Improvement
JSON_Parse_1 +49.5% Improvement
JSON_Parse_Real +56.2% Improvement
JSON_Parse_Decimal +53.6% Improvement
JSON_Parse_Schema_ISO_Language +53.1% Improvement
JSON_Parse_Integer +49.9% Improvement
JSON_Parse_String_NonSSO_Plain +52.7% Improvement
JSON_Parse_String_SSO_Plain +46.7% Improvement
JSON_Parse_String_Escape_Heavy +48.7% Improvement
JSON_Parse_Object_Short_Keys +48.3% Improvement
JSON_Parse_Object_Scalar_Properties +47.7% Improvement
JSON_Parse_Object_Array_Properties +44.6% Improvement
JSON_Parse_Object_Object_Properties +46.2% Improvement
JSON_Parse_Nested_Containers +50.7% Improvement
JSON_From_String_Copy +53.0% Improvement
JSON_From_String_Temporary +41.7% Improvement
JSON_Number_To_Double +6.2% Improvement
JSON_String_Equal_Small_By_Runtime_Perfect_Hash/10 +5.7% Improvement
JSON_String_Fast_Hash/10 +8.5% Improvement
JSON_String_Fast_Hash/100 +6.9% Improvement
JSON_String_Key_Hash/10 25.0% Regression
JSONL_Parse_Large +41.8% Improvement
JSONLD_Catalog_Annotation_List_Populate +7.9% Improvement
JSONLD_Catalog_Materialize +8.1% Improvement

3. Pointer & JSONPath Operations

Benchmark Performance Change
Pointer_Object_Traverse +48.5% Improvement
Pointer_Object_Try_Traverse +55.1% Improvement
Pointer_Push_Back_Pointer_To_Weak_Pointer +45.0% Improvement
Pointer_Walker_Schema_ISO_Language +48.7% Improvement
Pointer_Maybe_Tracked_Deeply_Nested/0 +48.5% Improvement
Pointer_Maybe_Tracked_Deeply_Nested/1 +50.0% Improvement
Pointer_Position_Tracker_Get_Deeply_Nested +51.5% Improvement
JSONPath_Descendant_Filter_Nested +49.8% Improvement

4. URI Template Router Operations

Benchmark Performance Change
URITemplateRouter_Create +55.0% Improvement
URITemplateRouter_Match +62.5% Improvement
URITemplateRouter_Match_BasePath +51.0% Improvement
URITemplateRouterView_Restore +69.3% Improvement
URITemplateRouterView_Match +53.4% Improvement
URITemplateRouterView_Match_BasePath +52.7% Improvement
URITemplateRouterView_Arguments +58.4% Improvement

Review in cubic

Signed-off-by: Vansh <officialbusiness9818@gmail.com>
@Vansh-kap-98
Vansh-kap-98 force-pushed the feature/mimalloc-integration branch from 98b80e7 to 66cfe1d Compare August 6, 2026 07:47

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All reported issues were addressed

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread benchmark/CMakeLists.txt Outdated
Comment thread benchmark/CMakeLists.txt Outdated
Comment thread benchmark/CMakeLists.txt
Comment thread cmake/FindMimalloc.cmake Outdated
Comment thread cmake/FindMimalloc.cmake Outdated
Comment thread CMakeLists.txt Outdated
@Vansh-kap-98
Vansh-kap-98 marked this pull request as draft August 6, 2026 10:04
… benchmark CMakeLists

Signed-off-by: Vansh <officialbusiness9818@gmail.com>
@Vansh-kap-98
Vansh-kap-98 marked this pull request as ready for review August 6, 2026 11:21

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2 issues found across 58 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="cmake/FindMimalloc.cmake">

<violation number="1" location="cmake/FindMimalloc.cmake:16">
P2: When a static mimalloc with MI_OVERRIDE is linked as an ordinary archive (not whole-archive), the linker may only pull in the objects that resolve currently-undefined symbols, so the malloc/free override can silently fail on some platforms or link orders. Consider propagating whole-archive linking (e.g. target_link_options with $<LINK_LIBRARY:WHOLE_ARCHIVE,mimalloc-static>, or linking the benchmark executable with --whole-archive) so the override that the benchmark gains depend on is guaranteed and reproducible.</violation>
</file>

<file name="CMakeLists.txt">

<violation number="1" location="CMakeLists.txt:77">
P3: The new SOURCEMETA_CORE_ALLOCATOR option is declared at the top-level and immediately drives `find_package(Mimalloc REQUIRED)`, but the only target that ever links the resulting library is the benchmark (and benchmarks default OFF). So a user who picks "mimalloc" expecting the core library stack to use it gets nothing changed, while still paying for a full mimalloc configure/build and risking a hard configure failure from the REQUIRED find when only the non-benchmark build is wanted. Consider gating the find_package (and ideally the option's effect) behind SOURCEMATA_CORE_BENCHMARK, and either documenting that the allocator only applies to the benchmark or actually threading the link into the core libraries so the option does what its description says.</violation>
</file>

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread cmake/FindMimalloc.cmake
if(TARGET mimalloc-static)
set_target_properties(mimalloc-static
PROPERTIES COMPILE_WARNING_AS_ERROR OFF)
add_library(Mimalloc::Mimalloc ALIAS mimalloc-static)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2: When a static mimalloc with MI_OVERRIDE is linked as an ordinary archive (not whole-archive), the linker may only pull in the objects that resolve currently-undefined symbols, so the malloc/free override can silently fail on some platforms or link orders. Consider propagating whole-archive linking (e.g. target_link_options with $<LINK_LIBRARY:WHOLE_ARCHIVE,mimalloc-static>, or linking the benchmark executable with --whole-archive) so the override that the benchmark gains depend on is guaranteed and reproducible.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At cmake/FindMimalloc.cmake, line 16:

<comment>When a static mimalloc with MI_OVERRIDE is linked as an ordinary archive (not whole-archive), the linker may only pull in the objects that resolve currently-undefined symbols, so the malloc/free override can silently fail on some platforms or link orders. Consider propagating whole-archive linking (e.g. target_link_options with $<LINK_LIBRARY:WHOLE_ARCHIVE,mimalloc-static>, or linking the benchmark executable with --whole-archive) so the override that the benchmark gains depend on is guaranteed and reproducible.</comment>

<file context>
@@ -0,0 +1,19 @@
+  if(TARGET mimalloc-static)
+    set_target_properties(mimalloc-static
+      PROPERTIES COMPILE_WARNING_AS_ERROR OFF)
+    add_library(Mimalloc::Mimalloc ALIAS mimalloc-static)
+    set(Mimalloc_FOUND ON)
+  endif()
</file context>

Comment thread CMakeLists.txt

# TODO: Turn this into a re-usable utility CMake function
if(SOURCEMETA_CORE_ALLOCATOR STREQUAL "mimalloc")
find_package(Mimalloc REQUIRED)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: The new SOURCEMETA_CORE_ALLOCATOR option is declared at the top-level and immediately drives find_package(Mimalloc REQUIRED), but the only target that ever links the resulting library is the benchmark (and benchmarks default OFF). So a user who picks "mimalloc" expecting the core library stack to use it gets nothing changed, while still paying for a full mimalloc configure/build and risking a hard configure failure from the REQUIRED find when only the non-benchmark build is wanted. Consider gating the find_package (and ideally the option's effect) behind SOURCEMATA_CORE_BENCHMARK, and either documenting that the allocator only applies to the benchmark or actually threading the link into the core libraries so the option does what its description says.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At CMakeLists.txt, line 77:

<comment>The new SOURCEMETA_CORE_ALLOCATOR option is declared at the top-level and immediately drives `find_package(Mimalloc REQUIRED)`, but the only target that ever links the resulting library is the benchmark (and benchmarks default OFF). So a user who picks "mimalloc" expecting the core library stack to use it gets nothing changed, while still paying for a full mimalloc configure/build and risking a hard configure failure from the REQUIRED find when only the non-benchmark build is wanted. Consider gating the find_package (and ideally the option's effect) behind SOURCEMATA_CORE_BENCHMARK, and either documenting that the allocator only applies to the benchmark or actually threading the link into the core libraries so the option does what its description says.</comment>

<file context>
@@ -55,19 +55,29 @@ option(SOURCEMETA_CORE_CONTRIB_GOOGLEBENCHMARK "Build the GoogleBenchmark librar
 
-# TODO: Turn this into a re-usable utility CMake function
+if(SOURCEMETA_CORE_ALLOCATOR STREQUAL "mimalloc")
+  find_package(Mimalloc REQUIRED)
+endif()
+
</file context>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant