p0 = malloc(size0); p1 = malloc(size1); p2 = malloc(size2); ... free(p2); free(p1); free(p0);
p0 = malloc_autoRelease(size0); p1 = malloc_autoRelease(size1); p2 = malloc_autoRelease(size2); ... release();
p0 = malloc_autoRelease(size0); p1 = newObject_autoRelease(...); ... release();
void myFunc()
{
ARP *pool = newAutoReleasePool();
p0 = malloc_autoRelease(pool, size0);
p1 = newObject_autoRelease(pool, ...);
...
releaseARP(pool);
}void func21()
{
int i, n = 1000000, **a = malloc(n * sizeof (int *));
for (i = 0; i < n; i++)
a[i] = malloc(64);
for (i = 0; i < n; i += 2)
free(a[i]); // 偶数番目だけを先に開放.
for (i = 1; i < n; i += 2)
free(a[i]); // 奇数番目をその後に開放.
free(a);
}void func22(AM *m2, AM *m)
// m2は64バイトの確保・解放のみに特化したメモリ管理アルゴリズムを想定.
{
int i, n = 1000000, **a = AM_alc(m, 0, n * sizeof (int *));
for (i = 0; i < n; i++)
a[i] = AM_alc(m2, 0, 64);
for (i = 0; i < n; i += 2)
AM_fre(m2, a[i], 64);
for (i = 1; i < n; i += 2)
AM_fre(m2, a[i], 64);
AM_fre(m, a, n * sizeof (int *));
}| func21() | 0.234秒 | mallocとfree |
| func22(am0, am0) | 0.237秒 | am0はmalloc/freeをそのまま使うだけのアルゴリズム、オーバーヘッドが増えた分だけ少しだけ遅い |
| func22(m2, am0) | 0.065秒 | m2は64バイトのメモリを高速に管理できるアルゴリズム、func21よりも3.6倍速い結果になった |