Нужно написать простой алокатор, размер элемента один, количество ограничено и известно. Необходим алокатор переиспользующий память. ценарий очень простой, создание и уничтожение одинаковых элементов.
Киньте ссылкой в готовую реализацию, буду благодарен.
Здравствуйте, Caracrist, Вы писали:
C>Нужно написать простой алокатор, размер элемента один, количество ограничено и известно. Необходим алокатор переиспользующий память. ценарий очень простой, создание и уничтожение одинаковых элементов. C>Киньте ссылкой в готовую реализацию, буду благодарен. boost::object_pool
Re: уберегите от велосипеда (очень простой алокатор)
Здравствуйте, Caracrist, Вы писали:
C>Нужно написать простой алокатор, размер элемента один, количество ограничено и известно. Необходим алокатор переиспользующий память. ценарий очень простой, создание и уничтожение одинаковых элементов. C>Киньте ссылкой в готовую реализацию, буду благодарен. http://lj.rossia.org/users/kouzdra/664091.html#cutid3
Re: уберегите от велосипеда (очень простой алокатор)
Здравствуйте, Caracrist, Вы писали:
C>Нужно написать простой алокатор, размер элемента один, количество ограничено и известно. Необходим алокатор переиспользующий память. ценарий очень простой, создание и уничтожение одинаковых элементов. C>Киньте ссылкой в готовую реализацию, буду благодарен.
Могу разве что только свой лисапед скинуть
Не надо бояться велосипедов если руки ровные.
Велосипед может оказаться более подходящим решением чем громозкая generic либа т.к. может быть оптимально заточен под конкретную задачу.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[2]: уберегите от велосипеда (очень простой алокатор)
Здравствуйте, Guard_h4s, Вы писали:
G_>Здравствуйте, Caracrist, Вы писали:
C>>Нужно написать простой алокатор, размер элемента один, количество ограничено и известно. Необходим алокатор переиспользующий память. ценарий очень простой, создание и уничтожение одинаковых элементов. C>>Киньте ссылкой в готовую реализацию, буду благодарен. G_>boost::object_pool
Это, кстати, тормоз ацкий. Я когда тестировал, выделял быстро, но медленно отдавал. Собственно, как fixed size аллокатор не годится.
Re[3]: уберегите от велосипеда (очень простой алокатор)
Здравствуйте, D14, Вы писали:
D14>Здравствуйте, Guard_h4s, Вы писали:
G_>>Здравствуйте, Caracrist, Вы писали:
C>>>Нужно написать простой алокатор, размер элемента один, количество ограничено и известно. Необходим алокатор переиспользующий память. ценарий очень простой, создание и уничтожение одинаковых элементов. C>>>Киньте ссылкой в готовую реализацию, буду благодарен. G_>>boost::object_pool D14>Это, кстати, тормоз ацкий. Я когда тестировал, выделял быстро, но медленно отдавал. Собственно, как fixed size аллокатор не годится.
Сам использую, особых проблем со скоростью освобождения не замечал (правда просто boost::pool в связке с перегруженными для класса операторами new/delete) Объектов в среднем 1-2М
Re[4]: уберегите от велосипеда (очень простой алокатор)
Здравствуйте, Guard_h4s, Вы писали:
C>>>>Киньте ссылкой в готовую реализацию, буду благодарен. G_>>>boost::object_pool D14>>Это, кстати, тормоз ацкий. Я когда тестировал, выделял быстро, но медленно отдавал. Собственно, как fixed size аллокатор не годится. G_>Сам использую, особых проблем со скоростью освобождения не замечал (правда просто boost::pool в связке с перегруженными для класса операторами new/delete) Объектов в среднем 1-2М
Не может такого быть. С перегруженным delete. Не предназначен pool для этого. Хуже new/delete результат будет.
#include <iostream>
#include <vector>
#include <ctime>
#include <boost\pool\object_pool.hpp>
struct X
{
int i;
};
boost::object_pool<X> pool_alloc;
void* free_list=0;
X* new_x()
{
if (free_list != NULL)
{
void * res = free_list;
free_list = *(void **)free_list;
return (X*)res;
}
return new X;
}
void delete_x(X* ptr)
{
if (ptr == NULL) return;
*(void **)ptr = free_list;
free_list = ptr;
}
const int n = 50000;
const int m = 10;
std::vector<X*> ptrs(n);
void run1()
{
clock_t start = clock();
for (int j=0; j<m; ++j)
{
for (int i=0; i<n; ++i)
{
ptrs[i] = pool_alloc.construct();
}
for (int i=0; i<n; ++i)
{
pool_alloc.destroy(ptrs[i]);
}
}
clock_t finish = clock();
printf ("Pool alloc takes %g sec.\n", (double)(finish - start) / CLOCKS_PER_SEC);
}
void run2()
{
clock_t start = clock();
for (int j=0; j<m; ++j)
{
for (int i=0; i<n; ++i)
{
ptrs[i] = new X;
}
for (int i=0; i<n; ++i)
{
delete ptrs[i];
}
}
clock_t finish = clock();
printf ("New/delete takes %g sec.\n", (double)(finish - start) / CLOCKS_PER_SEC);
}
int main()
{
run1();
run2();
return 0;
}
Pool alloc takes 21.587 sec.
New/delete takes 0.04 sec.
Re: уберегите от велосипеда (очень простой алокатор)
Здравствуйте, Caracrist, Вы писали:
C>Нужно написать простой алокатор, размер элемента один, количество ограничено и известно. Необходим алокатор переиспользующий память. ценарий очень простой, создание и уничтожение одинаковых элементов. C>Киньте ссылкой в готовую реализацию, буду благодарен.
и пул уже впереди:
Pool alloc takes 0.015 sec.
New/delete takes 0.188 sec.
я boost::pool(точнее boost::fast_pool_allocator из boost::pool) активно использую для контейнера std::set — мелких обьектов, в котором количество записей может до сотни, однако вставок/удалений в контейнер в процессе работы происхоит миллионы, по сравнению со стандартным аллокатором- выигрышь очень большой.
Re[5]: уберегите от велосипеда (очень простой алокатор)
Здравствуйте, sidorov18, Вы писали:
S>Скажите пожалуйста, а в чем смысл вот этого выражения:
S>
S>free_list = *(void **)free_list;//тут, как я понял, вы присваиваете указателю его же значение?
S>
В велосипедном аллокататоре по той ссылке, что я привел, автор использует связанный список неиспользуемых чанков. Данная конкретная строка присваивает списку неиспольуемых чанков значение хвоста списка, т.к. голову собираемся использовать.
Re[6]: уберегите от велосипеда (очень простой алокатор)
Здравствуйте, Sni4ok, Вы писали:
S>и пул уже впереди: S>Pool alloc takes 0.015 sec. S>New/delete takes 0.188 sec.
А теперь с "велосипедом" тайминги, будьте так добры.
S>я boost::pool(точнее boost::fast_pool_allocator из boost::pool) активно использую для контейнера std::set — мелких обьектов, в котором количество записей может до сотни, однако вставок/удалений в контейнер в процессе работы происхоит миллионы, по сравнению со стандартным аллокатором- выигрышь очень большой.
Ну, set, особливо его деструктор, тот ещё тормоз. Чтобы улучшить ситуацию идея не отдавать память вообще может быть применена, но не стоит ее абсолютизировать. Таки иногда имеет смысл в поворном использовании памяти, и в общем случае pool не заменяет fixed-size allocator.
Re[7]: уберегите от велосипеда (очень простой алокатор)
Здравствуйте, D14, Вы писали:
D14>А теперь с "велосипедом" тайминги, будьте так добры.
не понял о чём вы.
D14>Ну, set, особливо его деструктор, тот ещё тормоз. Чтобы улучшить ситуацию идея не отдавать память вообще может быть применена, но не стоит ее абсолютизировать.
там при работе с этим контейнером память отдаётся- пулу, при частой аллокации-освобождении(а не как в вашем синтетическом тесте, когда много подрят выделений а потом много подрят освобождений) boost::pool сильно эффективней чем new/delete.
Re[5]: уберегите от велосипеда (очень простой алокатор)
Здравствуйте, D14, Вы писали:
D14>Не может такого быть. С перегруженным delete. Не предназначен pool для этого. Хуже new/delete результат будет.
Пожалуйста:
Здравствуйте, Sni4ok, Вы писали:
S>Здравствуйте, D14, Вы писали:
D14>>А теперь с "велосипедом" тайминги, будьте так добры. S>не понял о чём вы. http://lj.rossia.org/users/kouzdra/664091.html#cutid3
S>там при работе с этим контейнером память отдаётся- пулу, при частой аллокации-освобождении(а не как в вашем синтетическом тесте, когда много подрят выделений а потом много подрят освобождений) boost::pool сильно эффективней чем new/delete.
Я так не думаю. Контейнер счетчика ссылок shared_ptr это частая аллокация/деаллокация?
Re: уберегите от велосипеда (очень простой алокатор)
Здравствуйте, Caracrist, Вы писали:
C>Нужно написать простой алокатор, размер элемента один, количество ограничено и известно. Необходим алокатор переиспользующий память. ценарий очень простой, создание и уничтожение одинаковых элементов. C>Киньте ссылкой в готовую реализацию, буду благодарен.
Недавно была такая задача. Решили взять аллокатор из Локи, как наиболее разумный.
И... в итоге сильно обработать напильником для оптимизации скорости (удаления).