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, j, n = 1024 * 1024, **a = malloc(n * sizeof (int *)), *t;
aXorShift32_seed(0); // 乱数を同じseedで初期化.
for (i = 0; i < n; i++)
a[i] = malloc(64);
for (i = 0; i < n; i++) { // a[i]をシャッフルする.
j = aXorShift32() & (n - 1);
t = a[i]; a[i] = a[j]; a[j] = t;
}
for (i = 0; i < n; i++)
free(a[i]); // ランダムな順番で開放される.
free(a);
}void func22(AM *m2, AM *m)
// m2は64バイトの確保・解放のみに特化したメモリ管理アルゴリズムを想定.
{
int i, j, n = 1024 * 1024, **a = AM_alc(m, 0, n * sizeof (int *)), *t;
aXorShift32_seed(0);
for (i = 0; i < n; i++)
a[i] = AM_alc(m2, 0, 64);
for (i = 0; i < n; i++) {
j = aXorShift32() & (n - 1);
t = a[i]; a[i] = a[j]; a[j] = t;
}
for (i = 0; i < n; i++)
AM_fre(m2, a[i], 64);
AM_fre(m, a, n * sizeof (int *));
}
// void *AM_alc(AM *m, int flag, AInt siz) : flagを1にすると、autoRelease指定になる. 2にするとcalloc相当になる. 3だと両方.
// void AM_fre(AM *m, void *p, AInt siz) : AM_fre()では、解放するときにもsizを指定するというルールになっている(面倒を増やしてすみません).| func21() | 0.228秒 | mallocとfree |
| func22(am0, am0) | 0.233秒 | am0はmalloc/freeをそのまま使うだけのアルゴリズム、オーバーヘッドが増えた分だけ少し遅い |
| func22(m2, am0) | 0.076秒 | m2は64バイトのメモリを高速に管理できるアルゴリズム、func21よりも3.0倍速い結果になった |