Я предполагаю, что большинство распределений относятся к списку объектов, о которых вы говорите. Если вы на самом деле выделяете кучу других объектов как часть слишком медленного анализа, тогда вам нужно больше информации для оптимизации.
Я ничего не знаю о коллекциях RogueWave, но если их связанный список выделяет внешний узел, тогда вы сможете сократить количество выделений вдвое, используя навязчивый список - при необходимости напишите свой собственный контейнер , Это предполагает, что вам не нужно помещать одни и те же объекты в несколько списков одновременно (или в один и тот же список более одного раза).
Если ваше приложение многопоточное, то распределитель памяти, скорее всего, будет выполнять некоторую синхронизацию. Но если вы можете организовать освобождение этих объектов в том же потоке, в котором они размещены, то они могут быть выделены из кучи для каждого потока, перегрузив оператор new. Это может быть быстрее: синхронизация не обязательно является настолько медленной, если нет конкуренции, но она занимает больше времени, чем ничего, и если другие потоки в вашем процессе выделяются одновременно, тогда возникнет конфликт.
Для еще более ограниченных сценариев использования, если вы обнаружите, что распределяете целую загрузку этих вещей, а затем всегда освобождаете их все сразу, когда закончите со списком, вы можете написать еще быстрее " gc-style "распределитель.
Оператор new / delete будет вызывать функции, подобные этим (и размер может быть константой, а не параметром, если есть только один класс, для которого вы используете пул):
char *alloc(POOL *pool, size_t size) {
// if size is a parameter, and may be a non-multiple the max alignment
// requirement on your system, and you want this to work in general:
// size = (size + MAX_ALIGNMENT - 1) % ALIGNMENT;
char *block = pool.current;
char *next = block + size;
if (next > pool.limit) throw std::bad_alloc();
pool.current = next;
return block;
}
void free(char *block) {
return;
}
void freeAll(POOL *pool) {
pool.current = pool.start;
return;
}
Это должно гарантировать, что оператор new занимает тривиальное время по сравнению с тем, что вы тратите на анализ создаваемых вами объектов. Но для этого требуется, чтобы приложение идентифицировало время, в которое оно должно создавать, уничтожать и очищать пулы, и использовать подходящий новый оператор, принимающий указатель на пул в качестве параметра, так что это не замена для замены.