P3: Skip header write in alloc path when class_map is active

Skip the 1-byte header write in tiny_region_id_write_header() when class_map
is active (default). class_map provides out-of-band class_idx lookup, making
the header byte unnecessary for the free path.

Changes:
- Add ENV-gated conditional to skip header write (default: skip)
- ENV: HAKMEM_TINY_WRITE_HEADER=1 to force header write (legacy mode)
- Memory layout preserved: user pointer = base + 1 (1B unused when skipped)

Performance improvement:
- tiny_hot 64B: 83.5M → 84.2M ops/sec (+0.8%)
- random_mixed ws=256: 68.1M → 72.2M ops/sec (+6%)

The header skip reduces one store instruction per allocation, which is
particularly beneficial for mixed-size workloads like random_mixed.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Moe Charm (CI)
2025-11-28 14:46:55 +09:00
parent a6e681aae7
commit 912123cbbe

View File

@ -232,9 +232,21 @@ static inline void* tiny_region_id_write_header(void* base, int class_idx) {
} }
} while (0); } while (0);
*header_ptr = HEADER_MAGIC | (class_idx & HEADER_CLASS_MASK); // P3: Skip header write when class_map is active (default)
PTR_TRACK_HEADER_WRITE(base, HEADER_MAGIC | (class_idx & HEADER_CLASS_MASK)); // class_map provides class_idx lookup, so header byte is no longer needed
void* user = header_ptr + 1; // skip header for user pointer // ENV: HAKMEM_TINY_WRITE_HEADER=1 to force header write (legacy mode)
// Memory layout preserved: user = base + 1 (1B unused when skipped)
static int g_write_header = -1;
if (__builtin_expect(g_write_header == -1, 0)) {
const char* e = getenv("HAKMEM_TINY_WRITE_HEADER");
g_write_header = (e && *e && *e != '0') ? 1 : 0;
}
if (__builtin_expect(g_write_header, 0)) {
// Legacy mode: write header for debugging or compatibility
*header_ptr = HEADER_MAGIC | (class_idx & HEADER_CLASS_MASK);
PTR_TRACK_HEADER_WRITE(base, HEADER_MAGIC | (class_idx & HEADER_CLASS_MASK));
}
void* user = header_ptr + 1; // skip header for user pointer (layout preserved)
PTR_TRACK_MALLOC(base, 0, class_idx); // Track at BASE (where header is) PTR_TRACK_MALLOC(base, 0, class_idx); // Track at BASE (where header is)
// ========== ALLOCATION LOGGING (Debug builds only) ========== // ========== ALLOCATION LOGGING (Debug builds only) ==========