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:
@ -232,9 +232,21 @@ static inline void* tiny_region_id_write_header(void* base, int class_idx) {
|
||||
}
|
||||
} while (0);
|
||||
|
||||
*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
|
||||
// P3: Skip header write when class_map is active (default)
|
||||
// class_map provides class_idx lookup, so header byte is no longer needed
|
||||
// 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)
|
||||
|
||||
// ========== ALLOCATION LOGGING (Debug builds only) ==========
|
||||
|
||||
Reference in New Issue
Block a user