Потокобезопасный mempool не дает лучшей производительности по сравнению с традиционным новым подходом к удалению в C ++. Почему? - PullRequest
0 голосов
/ 28 мая 2019

Я реализовал 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-ядерная.

...