Portál AbcLinuxu, 1. listopadu 2025 15:07
Knihovní malloc() je pěkně obecný (thread-safe a kdo ví, co všechno ještě), ale rychlostí opravdu neoplývá, zvlášť při alokování maličkých bloků (ostatně paměťový overhead jednoho pointeru na alokovaný blok také není zanedbatelný).
V takovémhle případě je nejrychlejší napsat si alokátor vlastní, který ví o tom, že alokujete pořád stejné bloky (to sice není obecně pravda, ale pokud program alokuje spoustu bloků, jsou skoro vždy několika málo různých velikostí). Pěkným příkladem je třeba SLAB alokator použitý v kernelu.
Tím určitě nechci pány popeláře zatracovat, ono programování s garbage collectorem je opravdu příjemné a návykové, ale určitě bych to nedělal kvůli výkonu...
#include <gc/gc.h>
#include <stdlib.h>
#define MAX_ALLOCATIONS (416660)
#define USE_GC
#ifdef USE_GC
#define ALLOC(x) (GC_MALLOC_ATOMIC(x))
#define FREE(x) {}
#endif
#ifdef USE_GLIBC
#define ALLOC(x) (malloc(x))
#define FREE(x) free(x)
#endif
#ifdef USE_LEAVE_ALLOCATED
#define ALLOC(x) (malloc(x))
#define FREE(x) {}
#endif
int main(int argc, char **argv)
{
unsigned long i;
unsigned long result;
for (i = 0; i < MAX_ALLOCATIONS; i++) {
int * a = ALLOC(3000*sizeof(unsigned long));
*a = i * 2;
result += *a;
FREE(a);
}
return 0;
}
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.