62 lines
2.0 KiB
C
62 lines
2.0 KiB
C
|
|
#include <stdio.h>
|
||
|
|
#include <stdlib.h>
|
||
|
|
#include <sys/resource.h>
|
||
|
|
|
||
|
|
// Dummy function for system malloc
|
||
|
|
void hak_tiny_magazine_flush_all(void) { /* no-op */ }
|
||
|
|
|
||
|
|
void battle_test(int n, const char* label) {
|
||
|
|
struct rusage usage;
|
||
|
|
void** ptrs = malloc(n * sizeof(void*));
|
||
|
|
|
||
|
|
printf("\n=== %s Test (n=%d) ===\n", label, n);
|
||
|
|
|
||
|
|
// Allocate
|
||
|
|
for (int i = 0; i < n; i++) {
|
||
|
|
ptrs[i] = malloc(16);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Measure at peak
|
||
|
|
getrusage(RUSAGE_SELF, &usage);
|
||
|
|
float data_mb = (n * 16) / 1024.0 / 1024.0;
|
||
|
|
float rss_mb = usage.ru_maxrss / 1024.0;
|
||
|
|
float overhead = (rss_mb - data_mb) / data_mb * 100;
|
||
|
|
|
||
|
|
printf("Peak: %.1f MB data → %.1f MB RSS (%.0f%% overhead)\n",
|
||
|
|
data_mb, rss_mb, overhead);
|
||
|
|
|
||
|
|
// Free all
|
||
|
|
for (int i = 0; i < n; i++) {
|
||
|
|
free(ptrs[i]);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Flush (no-op for system malloc)
|
||
|
|
hak_tiny_magazine_flush_all();
|
||
|
|
|
||
|
|
// Measure after free
|
||
|
|
getrusage(RUSAGE_SELF, &usage);
|
||
|
|
float rss_after = usage.ru_maxrss / 1024.0;
|
||
|
|
printf("After: %.1f MB RSS (%.1f MB freed)\n",
|
||
|
|
rss_after, rss_mb - rss_after);
|
||
|
|
|
||
|
|
free(ptrs);
|
||
|
|
}
|
||
|
|
|
||
|
|
int main() {
|
||
|
|
printf("╔════════════════════════════════════════╗\n");
|
||
|
|
printf("║ System malloc / mimalloc ║\n");
|
||
|
|
printf("╚════════════════════════════════════════╝\n");
|
||
|
|
|
||
|
|
battle_test(100000, "100K");
|
||
|
|
battle_test(500000, "500K");
|
||
|
|
battle_test(1000000, "1M");
|
||
|
|
battle_test(2000000, "2M");
|
||
|
|
battle_test(5000000, "5M");
|
||
|
|
|
||
|
|
printf("\n╔════════════════════════════════════════╗\n");
|
||
|
|
printf("║ BATTLE COMPLETE! ║\n");
|
||
|
|
printf("╚════════════════════════════════════════╝\n");
|
||
|
|
|
||
|
|
return 0;
|
||
|
|
}
|