Skip to content

fix(codecache): make memoryUsage() accurate and live#677

Open
rkennke wants to merge 3 commits into
mainfrom
codecache-memusage-accuracy
Open

fix(codecache): make memoryUsage() accurate and live#677
rkennke wants to merge 3 commits into
mainfrom
codecache-memusage-accuracy

Conversation

@rkennke

@rkennke rkennke commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

What

Makes CodeCache::memoryUsage() — which drives the CODECACHE_NATIVE_SIZE_BYTES counter — report the profiler's actual native-symbol memory, instead of a stale, heavily-undercounted approximation.

(CodeCache here is the profiler's per-native-library symbol table used to symbolicate native frames — async-profiler's naming, not the JVM's JIT code cache.)

Why

The old formula _capacity * sizeof(CodeBlob*) + _count * sizeof(NativeFunc) was wrong in several ways:

  • Blob array undercounted ~3× — counted sizeof(CodeBlob*) (a pointer, 8 B) where the array actually holds CodeBlob (three pointers, 24 B).
  • Symbol names undercounted — approximated as a fixed sizeof(NativeFunc) (4 B) per symbol, ignoring the name-string length that dominates each allocation (aligned_alloc(sizeof(NativeFunc) + 1 + strlen(name))).
  • Missing entirely — the DWARF unwind table (_dwarf_table, can be large) and the build-id string.
  • StaleCodeCacheArray cached the sum at add() time via _used_memory, so it never reflected a library's later symbol growth.

How

  • CodeCache::memoryUsage() recomputes accurately: full blob array (sizeof(CodeBlob)), each symbol's real name allocation (new NativeFunc::allocSize()), this cache's own name, the DWARF table, and the build-id.
  • CodeCacheArray::memoryUsage() sums the live per-library values instead of a cached total. The array is append-only, so iterating the published prefix is safe alongside concurrent add()s. The now-dead _used_memory field and its add()-time accumulation are removed.
  • memoryUsage() is only called at dump time, so the O(symbols) recompute is off any hot path.

Testing

  • New codeCache_ut (3 tests): usage tracks per-symbol name length exactly; a longer name costs more than a shorter one; the blob array is counted at full CodeBlob size, not a pointer's.
  • Full :ddprof-lib:gtestDebug suite green — 352 tests, 0 failures.

Note

Independent of the native-memory accounting work in #669; that PR's NM_NATIVE_SYMBOLS gauge mirrors this memoryUsage(), so it benefits automatically once both land, but neither depends on the other to build.

🤖 Generated with Claude Code

CodeCache::memoryUsage() drove the CODECACHE_NATIVE_SIZE_BYTES counter
but both under-counted and went stale:

- The blob array was counted as _capacity * sizeof(CodeBlob*) — a
  pointer's worth — while the array holds CodeBlob (three pointers),
  a ~3x undercount.
- Symbol name strings were approximated as _count * sizeof(NativeFunc),
  a fixed 4 bytes each, ignoring the name length that dominates the
  actual allocation.
- The DWARF unwind table and build-id string were not counted at all.
- CodeCacheArray cached the sum at add() time, so it never reflected a
  library's later symbol growth.

Recompute both accurately on demand instead. CodeCache::memoryUsage() now
sums the full blob array, each symbol's real name-string allocation (via
new NativeFunc::allocSize()), its own name, the DWARF table, and the
build-id. CodeCacheArray::memoryUsage() sums the live per-library values
(the array is append-only, so iterating the published prefix is safe
alongside concurrent adds); the stale _used_memory cache is removed.
memoryUsage() is only called at dump time, so the O(symbols) recompute is
not on any hot path.

Tests: new codeCache_ut asserts usage tracks per-symbol name length, that
a longer name costs more than a shorter one, and that the blob array is
counted at full CodeBlob size rather than a pointer's.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 21, 2026 11:03

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Improves native-symbol memory accounting by making CodeCache::memoryUsage() (and the aggregated CodeCacheArray::memoryUsage()) recompute live, accurate heap usage for native symbol tables, which feeds the CODECACHE_NATIVE_SIZE_BYTES counter.

Changes:

  • Replaces the old approximation in CodeCache::memoryUsage() with a live recompute that accounts for the full blob array, variable-length symbol-name allocations, DWARF unwind table, build-id string, and the cache’s own name.
  • Removes CodeCacheArray’s cached _used_memory and sums per-library memoryUsage() at call time to reflect post-registration growth.
  • Adds codeCache_ut coverage validating that memory usage scales with symbol-name length and counts the full CodeBlob array size.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.

File Description
ddprof-lib/src/test/cpp/codeCache_ut.cpp Adds focused unit tests for memoryUsage() accuracy and growth behavior.
ddprof-lib/src/main/cpp/codeCache.h Introduces NativeFunc::allocSize(), updates CodeCache::memoryUsage() API, and makes CodeCacheArray::memoryUsage() sum live values.
ddprof-lib/src/main/cpp/codeCache.cpp Implements the new accurate, live CodeCache::memoryUsage() calculation.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread ddprof-lib/src/test/cpp/codeCache_ut.cpp

const char *name =
"a_long_symbol_name_well_beyond_sizeof_NativeFunc_padding_xxxxxxxxxxxx";
cc.add((const void *)0x1000, 16, name);
Comment on lines +32 to +34
shortc.add((const void *)0x1000, 8, "f");
longc.add((const void *)0x1000, 8,
"an_extremely_long_symbol_name_padded_out_further_and_further_1234");
@dd-octo-sts

dd-octo-sts Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

CI Test Results

Run: #29836797137 | Commit: b2a6275 | Duration: 3h 0m 15s (longest job)

All 32 test jobs passed

Status Overview

JDK glibc-aarch64/debug glibc-amd64/debug musl-aarch64/debug musl-amd64/debug
8 - - -
8-ibm - - -
8-j9 - -
8-librca - -
8-orcl - - -
11 - - -
11-j9 - -
11-librca - -
17 - -
17-graal - -
17-j9 - -
17-librca - -
21 - -
21-graal - -
21-librca - -
25 🚫 - -
25-graal - -
25-librca - -

Legend: ✅ passed | ❌ failed | ⚪ skipped | 🚫 cancelled

Summary: Total: 32 | Passed: 31 | Failed: 0 | Cancelled: 1


Updated: 2026-07-21 17:00:46 UTC

@dd-octo-sts

dd-octo-sts Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (commit cf42bb1)

Pipeline: https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines/125921385 Commit: cf42bb101900e542a11975befba2ad446ee2be97

⚠️ Significant outliers

  • 🟢 future-genetic (JDK 25): runtime -3.9% (2088→2006 ms)
Runtime details (per benchmark × JDK)
Benchmark JDK Latest Dev Δ (dev vs latest) Issues L/D
akka-uct 21 ✅ 10280 ms (21 iters) ✅ 10270 ms (21 iters) ≈ -0.1% (±11.8%) — / —
akka-uct 25 ✅ 8817 ms (24 iters) ✅ 8918 ms (24 iters) ≈ +1.1% (±10.1%) — / —
finagle-chirper 21 ✅ 6040 ms (33 iters) ✅ 5974 ms (33 iters) ≈ -1.1% (±25.3%) ⚠️ W:3 / ⚠️ W:3
finagle-chirper 25 ✅ 5505 ms (36 iters) ✅ 5373 ms (36 iters) ≈ -2.4% (±24.2%) ⚠️ W:4 / ⚠️ W:3
fj-kmeans 21 ✅ 2643 ms (71 iters) ✅ 2697 ms (70 iters) ≈ +2% (±2.6%) — / —
fj-kmeans 25 ✅ 2808 ms (66 iters) ✅ 2823 ms (66 iters) ≈ +0.5% (±2.6%) — / —
future-genetic 21 ✅ 2042 ms (90 iters) ✅ 2078 ms (89 iters) ≈ +1.8% (±2.5%) — / —
future-genetic 25 ✅ 2088 ms (89 iters) ✅ 2006 ms (93 iters) 🟢 -3.9% — / —
naive-bayes 21 ✅ 1288 ms (133 iters) ✅ 1253 ms (137 iters) ≈ -2.7% (±31.8%) — / —
naive-bayes 25 ✅ 1058 ms (162 iters) ✅ 991 ms (172 iters) ≈ -6.3% (±30.6%) — / —
reactors 21 ✅ 16460 ms (15 iters) ✅ 16646 ms (15 iters) ≈ +1.1% (±7.5%) — / —
reactors 25 ✅ 18515 ms (15 iters) ✅ 18521 ms (15 iters) ≈ +0% (±4.2%) — / —
Internal counter details (ddprof)

ddprof internal counters, latest / dev (✅ = 0, · = unavailable):

Benchmark JDK Dropped rec Dropped jvmti Dropped trace Skipped WC AGCT fail Unwind fail
akka-uct 21 ✅ / ✅ ✅ / ✅ 4 / 1 1950 / 1959 ✅ / ✅ ✅ / ✅
akka-uct 25 ✅ / ✅ ✅ / ✅ ✅ / 2 2209 / 2042 ✅ / ✅ ✅ / ✅
finagle-chirper 21 ✅ / ✅ ✅ / ✅ 2 / 1 8695 / 8520 ✅ / ✅ ✅ / ✅
finagle-chirper 25 ✅ / ✅ ✅ / ✅ ✅ / 1 8170 / 8562 ✅ / ✅ ✅ / ✅
fj-kmeans 21 ✅ / ✅ ✅ / ✅ ✅ / 1 1278 / 1297 ✅ / ✅ ✅ / ✅
fj-kmeans 25 ✅ / ✅ ✅ / ✅ 1 / 1 1258 / 1270 ✅ / ✅ ✅ / ✅
future-genetic 21 ✅ / ✅ ✅ / ✅ ✅ / 2 2890 / 2997 ✅ / ✅ ✅ / ✅
future-genetic 25 ✅ / ✅ ✅ / ✅ 1 / ✅ 2919 / 2906 ✅ / ✅ ✅ / ✅
naive-bayes 21 ✅ / ✅ ✅ / ✅ 3 / 1 3530 / 3526 ✅ / ✅ ✅ / ✅
naive-bayes 25 ✅ / ✅ ✅ / ✅ 2 / 7 3483 / 3505 ✅ / ✅ ✅ / ✅
reactors 21 ✅ / ✅ ✅ / ✅ ✅ / ✅ 1692 / 1796 ✅ / ✅ ✅ / ✅
reactors 25 ✅ / ✅ ✅ / ✅ ✅ / 1 1904 / 1851 ✅ / ✅ ✅ / ✅

…erences

Comments explained what the previous formula did wrong rather than what
the code now counts. Reword to describe the current behavior only.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 21, 2026 12:08
@rkennke
rkennke marked this pull request as ready for review July 21, 2026 12:08
@rkennke
rkennke requested a review from a team as a code owner July 21, 2026 12:08

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8d1c750d9f

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread ddprof-lib/src/main/cpp/codeCache.cpp Outdated
Comment on lines +161 to +162
if (_build_id != nullptr) {
total += (long long)strlen(_build_id) + 1;

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 Badge Synchronize reads of the published build-id

When remote symbolication is enabled, the background refresher can call Libraries::updateBuildIds() on already-published CodeCache objects while Profiler::dump() is computing these counters. setBuildId() assigns _build_id before copying the string into that allocation, but this new strlen(_build_id) runs without the _build_id_lock, so a concurrent dump can scan an uninitialized buffer and potentially read past the allocation or crash. Please publish build IDs only after initialization with synchronization/atomic ordering, or avoid dereferencing this mutable field without the same synchronization.

Useful? React with 👍 / 👎.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.

Comment thread ddprof-lib/src/main/cpp/codeCache.cpp Outdated
Comment on lines +159 to +163
// The DWARF unwind table and the build-id string, when present.
total += (long long)_dwarf_table_length * sizeof(FrameDesc);
if (_build_id != nullptr) {
total += (long long)strlen(_build_id) + 1;
}
Comment thread ddprof-lib/src/main/cpp/codeCache.h Outdated
// the per-symbol name strings (variable length), the DWARF unwind table, the
// build-id string, and this cache's own name. Recomputed on demand (called
// only at dump time), so it reflects the current contents.
long long memoryUsage();
Comment thread ddprof-lib/src/main/cpp/codeCache.cpp Outdated
@dd-octo-sts

dd-octo-sts Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (commit 8d1c750)

Pipeline: https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines/125932438 Commit: 8d1c750d9fb7130448dc1c9739e821a9f1cc73b2

⚠️ Significant outliers

  • 🔴 fj-kmeans (JDK 21): runtime +4.4% (2701→2820 ms)
  • 🔴 reactors (JDK 21): runtime +7.3% (16180→17360 ms)
Runtime details (per benchmark × JDK)
Benchmark JDK Latest Dev Δ (dev vs latest) Issues L/D
akka-uct 21 ✅ 10391 ms (21 iters) ✅ 10300 ms (21 iters) ≈ -0.9% (±11.5%) — / —
akka-uct 25 ✅ 8954 ms (24 iters) ✅ 8757 ms (24 iters) ≈ -2.2% (±10.1%) — / —
finagle-chirper 21 ✅ 5979 ms (33 iters) ✅ 5961 ms (33 iters) ≈ -0.3% (±25.1%) ⚠️ W:3 / ⚠️ W:3
finagle-chirper 25 ✅ 5511 ms (36 iters) ✅ 5514 ms (36 iters) ≈ +0.1% (±25%) ⚠️ W:3 / ⚠️ W:3
fj-kmeans 21 ✅ 2701 ms (69 iters) ✅ 2820 ms (66 iters) 🔴 +4.4% — / —
fj-kmeans 25 ✅ 2837 ms (66 iters) ✅ 2830 ms (66 iters) ≈ -0.2% (±2.6%) — / —
future-genetic 21 ✅ 2099 ms (88 iters) ✅ 2071 ms (90 iters) ≈ -1.3% (±2.7%) — / —
future-genetic 25 ✅ 2079 ms (89 iters) ✅ 2070 ms (90 iters) ≈ -0.4% (±2.7%) — / —
naive-bayes 21 ✅ 1288 ms (133 iters) ✅ 1305 ms (131 iters) ≈ +1.3% (±32.9%) — / —
naive-bayes 25 ✅ 1027 ms (166 iters) ✅ 1027 ms (166 iters) ≈ 0% (±31.8%) — / —
reactors 21 ✅ 16180 ms (15 iters) ✅ 17360 ms (15 iters) 🔴 +7.3% — / —
reactors 25 ✅ 18388 ms (15 iters) ✅ 18296 ms (15 iters) ≈ -0.5% (±4.7%) — / —
Internal counter details (ddprof)

ddprof internal counters, latest / dev (✅ = 0, · = unavailable):

Benchmark JDK Dropped rec Dropped jvmti Dropped trace Skipped WC AGCT fail Unwind fail
akka-uct 21 ✅ / ✅ ✅ / ✅ 3 / 1 2029 / 1937 ✅ / ✅ ✅ / ✅
akka-uct 25 ✅ / ✅ ✅ / ✅ 3 / 3 2274 / 2377 ✅ / ✅ ✅ / ✅
finagle-chirper 21 ✅ / ✅ ✅ / ✅ 2 / 5 8644 / 8323 ✅ / ✅ ✅ / ✅
finagle-chirper 25 ✅ / ✅ ✅ / ✅ ✅ / 2 8369 / 8619 ✅ / ✅ ✅ / ✅
fj-kmeans 21 ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅ ✅ / ✅
fj-kmeans 25 ✅ / ✅ ✅ / ✅ 3 / 4 1282 / 1263 ✅ / ✅ ✅ / ✅
future-genetic 21 ✅ / ✅ ✅ / ✅ 3 / ✅ 2890 / 3007 ✅ / ✅ ✅ / ✅
future-genetic 25 ✅ / ✅ ✅ / ✅ 1 / 1 2938 / 2923 ✅ / ✅ ✅ / ✅
naive-bayes 21 ✅ / ✅ ✅ / ✅ 6 / 3 3490 / 3481 ✅ / ✅ ✅ / ✅
naive-bayes 25 ✅ / ✅ ✅ / ✅ 6 / 4 3496 / 3474 ✅ / ✅ ✅ / ✅
reactors 21 ✅ / ✅ ✅ / ✅ ✅ / 1 1697 / 1771 ✅ / ✅ ✅ / ✅
reactors 25 ✅ / ✅ ✅ / ✅ 1 / 2 1900 / 1864 ✅ / ✅ ✅ / ✅

…iew nits

Address PR review feedback:

- Drop the build-id from memoryUsage(). The background library refresher
  (Libraries::updateBuildIds) calls setBuildId() — which frees and
  replaces _build_id — on already-published caches under _build_id_lock,
  which dump does not hold. The strlen(_build_id) added here could race
  that free/replace (use-after-free / torn read). Build-id is negligible
  (~tens of bytes per library) next to the symbol tables, so excluding it
  keeps the read lock-free at no meaningful accuracy cost. The blob-name
  loop and dwarf-length read are safe: blobs are fixed once a library is
  published (same read the symbolication fast path does) and the dwarf
  read touches only the length scalar.
- Mark CodeCache::memoryUsage() const (it does not mutate state).
- Test: use reinterpret_cast for the integer-to-pointer args and drop the
  unused <cstring> include.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 21, 2026 13:56
@rkennke

rkennke commented Jul 21, 2026

Copy link
Copy Markdown
Contributor Author

Thanks for the reviews — addressed in cf512dd:

Build-id data race (codex P2 / Copilot) — Good catch. memoryUsage() no longer reads _build_id. The background refresher (Libraries::updateBuildIds) calls setBuildId() (free + replace) on already-published caches under _build_id_lock, which dump doesn't hold, so strlen(_build_id) could race that free → use-after-free. It's set at most once per lib and is only ~tens of bytes (a hash), negligible next to the symbol tables, so it's excluded rather than synchronized — keeping the read lock-free. The rest of the sum is safe: blob names are fixed once a library is published (same read the symbolication fast path does), and the DWARF contribution reads only the length scalar (no deref).

memoryUsage() should be const (Copilot) — Done, on both the declaration and definition.

Use reinterpret_cast for int→pointer in tests / drop unused <cstring> (Copilot) — Both done.

Re: the benchmark outliers (reactors +7.3%, fj-kmeans +4.4% on one commit; future-genetic -3.9% the other) — these look like run-to-run noise: they're near/within the reported variance bands and point in opposite directions across commits, and memoryUsage() runs only at dump time (off any hot path), so a real few-percent runtime effect isn't plausible from this change.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

Comment on lines +164 to +169
// The build-id string is intentionally NOT counted here: the background
// library refresher (Libraries::updateBuildIds) frees and replaces _build_id
// on already-published caches under _build_id_lock, which dump does not hold,
// so dereferencing it here would race. It is negligible (~tens of bytes per
// library) next to the symbol tables, so excluding it costs no meaningful
// accuracy while keeping this read lock-free.
@dd-octo-sts

dd-octo-sts Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results (commit cf512dd)

Pipeline: https://gitlab.ddbuild.io/DataDog/apm-reliability/benchmarking-platform/-/pipelines/125969722 Commit: cf512dde50e1b2f2f05058076b7451478e5203a9

✅ Within expected boundaries

No significant runtime deltas (all within run-to-run noise) and no internal-counter outliers.

Runtime details (per benchmark × JDK)
Benchmark JDK Latest Dev Δ (dev vs latest) Issues L/D
akka-uct 21 ✅ 10352 ms (21 iters) ✅ 10422 ms (21 iters) ≈ +0.7% (±11.1%) — / —
akka-uct 25 ✅ 8912 ms (24 iters) ✅ 8911 ms (24 iters) ≈ -0% (±10.3%) — / —
finagle-chirper 21 ✅ 6014 ms (33 iters) ✅ 5976 ms (33 iters) ≈ -0.6% (±25.3%) ⚠️ W:3 / ⚠️ W:3
finagle-chirper 25 ✅ 5525 ms (36 iters) ✅ 5447 ms (36 iters) ≈ -1.4% (±24.4%) ⚠️ W:3 / ⚠️ W:3
fj-kmeans 21 ✅ 2712 ms (70 iters) ✅ 2769 ms (67 iters) ≈ +2.1% (±2.8%) — / —
fj-kmeans 25 ✅ 2746 ms (68 iters) ✅ 2716 ms (68 iters) ≈ -1.1% (±2.8%) — / —
future-genetic 21 ✅ 2109 ms (88 iters) ✅ 2055 ms (90 iters) ≈ -2.6% (±2.6%) — / —
future-genetic 25 ✅ 2081 ms (90 iters) ✅ 2087 ms (89 iters) ≈ +0.3% (±2.5%) — / —
naive-bayes 21 ✅ 1273 ms (134 iters) ✅ 1279 ms (134 iters) ≈ +0.5% (±32.9%) — / —
naive-bayes 25 ✅ 1021 ms (167 iters) ✅ 1016 ms (168 iters) ≈ -0.5% (±31.5%) — / —
reactors 21 ✅ 16757 ms (15 iters) ✅ 15606 ms (15 iters) ≈ -6.9% (±7.1%) — / —
reactors 25 ✅ 18306 ms (15 iters) ✅ 18114 ms (15 iters) ≈ -1% (±5.4%) — / —
Internal counter details (ddprof)

ddprof internal counters, latest / dev (✅ = 0, · = unavailable):

Benchmark JDK Dropped rec Dropped jvmti Dropped trace Skipped WC AGCT fail Unwind fail
akka-uct 21 ✅ / ✅ ✅ / ✅ 1 / 3 1968 / 1907 ✅ / ✅ ✅ / ✅
akka-uct 25 ✅ / ✅ ✅ / ✅ 3 / 1 2398 / 2299 ✅ / ✅ ✅ / ✅
finagle-chirper 21 ✅ / ✅ ✅ / ✅ 5 / 6 8527 / 8398 ✅ / ✅ ✅ / ✅
finagle-chirper 25 ✅ / ✅ ✅ / ✅ 2 / ✅ 8450 / 8413 ✅ / ✅ ✅ / ✅
fj-kmeans 21 ✅ / ✅ ✅ / ✅ 1 / 1 1280 / 1250 ✅ / ✅ ✅ / ✅
fj-kmeans 25 ✅ / ✅ ✅ / ✅ 1 / 1 1251 / 1240 ✅ / ✅ ✅ / ✅
future-genetic 21 ✅ / ✅ ✅ / ✅ 2 / 1 2907 / 2970 ✅ / ✅ ✅ / ✅
future-genetic 25 ✅ / ✅ ✅ / ✅ 3 / 1 2956 / 2989 ✅ / ✅ ✅ / ✅
naive-bayes 21 ✅ / ✅ ✅ / ✅ 5 / 5 3508 / 3527 ✅ / ✅ ✅ / ✅
naive-bayes 25 ✅ / ✅ ✅ / ✅ 5 / 9 3457 / 3444 ✅ / ✅ ✅ / ✅
reactors 21 ✅ / ✅ ✅ / ✅ 1 / 1 1710 / 1549 ✅ / ✅ ✅ / ✅
reactors 25 ✅ / ✅ ✅ / ✅ ✅ / 3 1901 / 1731 ✅ / ✅ ✅ / ✅

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.

2 participants