cpp-main/cpp-tbox

添加 ObjectPool 的统计功能

hevake opened this issue · 7 comments

hevake commented

申请次数,释放次数。malloc次数等。

看了一下代码,这个ObjectPool还不是线程安全的。我感觉性能可能不如直接new/delete啊。

hevake commented

实测是有new与delete好的,耗时是new与delete的1/3。
之所以会快:

  1. 它不加锁。
  2. 纯链表指针操作,不需要根据申请空间大小去查表什么的。

在基于tbox框架开发中,大部分都是同一个线程中的内部操作,没有加锁的必要。

hevake commented
#include <vector>
#include <tbox/base/object_pool.hpp>
#include <tbox/util/time_counter.h>

struct MyData1 {
    char array[1500];
};

struct MyData2 {
    char array[100];
};

struct MyData3 {
    char array[10];
};


int main() {
    int times = 1000000;
    {
        SetTimeCounter();
        for (int i = 0; i < times; ++i) {
            auto *p1 = new MyData1;
            auto *p2 = new MyData2;
            auto *p3 = new MyData3;
            delete p1;
            delete p2;
            delete p3;
        }
    }
    {
        tbox::ObjectPool<MyData1> pool1;
        tbox::ObjectPool<MyData2> pool2;
        tbox::ObjectPool<MyData3> pool3;
        SetTimeCounter();
        for (int i = 0; i < times; ++i) {
            auto *p1 = pool1.alloc();
            auto *p2 = pool2.alloc();
            auto *p3 = pool3.alloc();
            pool1.free(p1);
            pool2.free(p2);
            pool3.free(p3);
        }
    }
}

图片

噢噢,不涉及多线程那你这么做肯定会快。还有一个问题就是释放的位置也必要知道对象的具体类型,这样就失去了抽象性了。

hevake commented

噢噢,不涉及多线程那你这么做肯定会快。还有一个问题就是释放的位置也必要知道对象的具体类型,这样就失去了抽象性了。

从哪个池子alloc(),就从哪里free()。
目前使用中,没有遇到这个问题。能说有一你具体的实用场景吗?

例如B从A派生,那么分配的类型是B,但很多场景下,可能是通过A类型指针释放对象的。这种情况下,就需要把A *转成B *来释放吧?我的意思是这种情况下失去抽象性。

hevake commented

done.