Я реализовал mempool, когда он не является потокобезопасным, в этом случае он дает лучший результат почти 1/3 от традиционного нового, delete, но как только я делаю его безопасным для потока, он работает медленнее по сравнению с традиционным новым,delete.
Mempool.cpp
template<typename T>
class Mempool {
private:
std::atomic<int> totalSize;
// int totalSize; // without thread safe
T **head;
// int allocPos; // without thread safe
std::atomic<int> allocPos;
void initialize() {
head = (T **) calloc(totalSize, sizeof(T *));
for (int i = allocPos; i < totalSize; i++) {
head[i] = (T*) calloc(1, sizeof(T));
}
}
void expand() {
totalSize += totalSize;
head = (T**) realloc(head, sizeof(T*) * totalSize);
for (int i = allocPos; i < totalSize; i++) { // As data till allocPos is already allocated
head[i] = (T*) calloc(1, sizeof(T));
}
}
public:
Mempool(int size) :
totalSize(size), head(nullptr), allocPos(0) {
initialize();
}
T* alloc() {
if (allocPos >= totalSize)
expand();
T* temp = head[allocPos++];
return temp;
}
void dealloc(T *f_node) {
head[--allocPos] = f_node;
}
~Mempool() {
for (int i = allocPos; i < totalSize; i++) { // As data till allocPos is already allocated
free(head[i]);
}
free(head);
}
};
class Variable {
public:
int a;
int b;
long c;
int d;
int e;
long f;
double g;
char h;
};
Mempool<Variable> varpool(200);
int main() {
const int testSize = 200;
std::string c("Case1");
Timer t1(c);
t1.start();
Variable *var1[testSize];
for (int j = 0; j < 30; ++j) {
for (int i = 0; i < testSize; ++i)
var1[i] = varpool.alloc();
for (int i = 0; i < testSize; ++i)
varpool.dealloc(var1[i]);
}
t1.stop();
c = "Case2";
Timer t2(c);
t2.start();
Variable *var2[testSize];
for (int j = 0; j < 30; ++j) {
for (int i = 0; i < testSize; ++i)
var2[i] = new Variable();
for (int i = 0; i < testSize; ++i)
delete var2[i];
}
t2.stop();
return 0;
}
Здесь таймер, показывающий больше времени для case1 во время поточно-ориентированной реализации.Я предполагаю, что это должно быть меньше, пожалуйста, укажите, какие изменения я должен внести в свою реализацию, чтобы добиться этого.
ОС: Linux Centos 7, 64-битная 4-ядерная.