LINUX.ORG.RU

[C][pool based memory allocator]

 


3

2

Подскажите какую-нибудь приличную сишную библиотеку для работы с памятью через пул объектов. Года 4 назад что-то находил, но название вылетело из головы совершенно.

Лицензия LGPL, BSD, etc...

★★★★★

Последнее исправление: mv (всего исправлений: 1)
Ответ на: комментарий от mv

> $ ./123

39282342

258812631



фигассе. не, я знал, что медленнее, но что бы так...

static void test(void *p)
{
volatile uint64_t* ptr = p;
uint64_t t1, t2;
int i;

t1 = rdtsc();
for (i = 0; i < 1000000; ++i)
*ptr = 1;
t2 = rdtsc();

printf(«%ld\n», t2 - t1);
}

int main()
{
char *tmp;

tmp = mmap(0, 4096 * 2, PROT_READ | PROT_WRITE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_POPULATE, -1, 0);
assert(tmp != MAP_FAILED);

test(tmp + 4);
test(tmp + 4096 - 4);

return 0;
}

./a.out
3633388
285297694

и без всякого вымывания tlb/cache. удивлен.

idle ★★★★★
()
Ответ на: комментарий от idle

из теста idle следует, что при записи через page boundary, ни tlb, ни cache не влияют на деградацию производительности. интересно, что если заменить 64-битную запись на две 32-битные (каждая из которых не пересекает границу страницы), то с производительностью все в порядке (правда, получается в 2 раза медленее, чем test(tmp+4), но этого и следовало ожидать).

кто-нибудь раскопал в чем причина торможения? может проц тормозит, потому что пытается обеспечить атомарность 64-битной записи?

тестил на 64 битах на c2d.

anonymous
()
Ответ на: комментарий от idle

У меня на 32 корке (первой) наоборот - первый тест медленнее второго. Почему такое поведение?

MuZHiK-2 ★★★★
()
Ответ на: комментарий от anonymous

> ни tlb, ни cache не влияют

да нет, они, конечно влияют. просто я исключил misses.

я не знаю, насколько в _данном_ случае у нас tlb виноват.
а cache, он же на x86 (не помню, как правильно называется)
physically indexed. те во втором случае мы две записи делаем.

но все равно, не ожидал такой разницы.

idle ★★★★★
()
Ответ на: комментарий от idle

> те во втором случае мы две записи делаем.

на моем ноуте L1_CACHE_BYTES=64, соответственно

test(tmp + 4);
test(tmp + 64 - 4);
test(tmp + 4096 - 4);

печатает

9828907
120168510
2698714678

(ессно, результаты не стабильны)

idle ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.