添加 ObjectPool 的统计功能
hevake opened this issue · 7 comments
hevake commented
申请次数,释放次数。malloc次数等。
Barenboim commented
看了一下代码,这个ObjectPool还不是线程安全的。我感觉性能可能不如直接new/delete啊。
hevake commented
实测是有new与delete好的,耗时是new与delete的1/3。
之所以会快:
- 它不加锁。
- 纯链表指针操作,不需要根据申请空间大小去查表什么的。
在基于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);
}
}
}
Barenboim commented
噢噢,不涉及多线程那你这么做肯定会快。还有一个问题就是释放的位置也必要知道对象的具体类型,这样就失去了抽象性了。
hevake commented
噢噢,不涉及多线程那你这么做肯定会快。还有一个问题就是释放的位置也必要知道对象的具体类型,这样就失去了抽象性了。
从哪个池子alloc(),就从哪里free()。
目前使用中,没有遇到这个问题。能说有一你具体的实用场景吗?
Barenboim commented
例如B从A派生,那么分配的类型是B,但很多场景下,可能是通过A类型指针释放对象的。这种情况下,就需要把A *转成B *来释放吧?我的意思是这种情况下失去抽象性。
hevake commented
done.