线程关联内存池再提速
来源:互联网 发布:ae软件制作视频教程 编辑:程序博客网 时间:2024/06/18 11:28
5、线程关联内存池再提速
上一节已经提到问题,解决办法是这样的
struct tm_bufunit
{
tm_pool *pool; //pool指针
union
{
tm_bufunit *next; //下一个块指针
char data[4]; //数据区域
};
};
static void *tm_malloc(size_t size, size_t *osize=NULL)
{
tm_bufunit *p = (tm_bufunit *)malloc(sizeof(tm_bufunit)-offsetof(tm_bufunit, data)+size);
if(p)
{
p->pool = NULL;
if(osize) *osize = size;
return p->data;
}
return NULL;
}
看上面的代码应该很容易明白,就是将由该池malloc的内存块也打上统一的标记,这样由该池分配的任何内存块都可用最简单的判断释放,省去了查找线程查找目标池的两次查询,不光提速了而且解决了上一节提到的那个bug。
最终实现的线程关联内存池通用分配函数tm_new大概相当于malloc 15倍左右的速度,定位到pool之后的newobj相当于malloc 45倍左右的速度。通用函数大致相当于nedmalloc速度的2.6-3倍,直接定位到pool的分配速度大概相当于dlmalloc 的2倍。
关于线程关联的内存池还有一些细节问题我没有展开讨论,如free表是每个线程保留一份还是全局保留一份,如果是全局保留一份则涉及到复用的时候如何分配,还有就是tls系列函数我看nedmalloc也在用,我第一版也在用,但后来实测发现这些函数貌似效率不高,后面的版本没有采用tls系列函数。
关于线程关联的内存池我写了5个版本,当然最重要的还是第一个版本,后面的版本除了这一节提到的重要改进之外变化不是很大,最后的第五版增了一些和我的私有lib相关的功能。
以前写文章太少,总是看别人的文章,在网络时代觉得自己挺自私,这次一鼓作气,一口气写了出来,可能写得很粗略,不知道有多少人能看明白,如能给读者一点启示我将感到很欣慰。
- 线程关联内存池再提速
- 线程关联的内存池
- 为 PHP 应用提速、提速、再提速!
- 为 PHP 应用提速、提速、再提速!
- 为 PHP 应用提速、提速、再提速
- [转]为 PHP 应用提速、提速、再提速!,第 3 部分: 用 Memcache 守护程序把数据缓存到内存中
- [转]为 PHP 应用提速、提速、再提速!,第 3 部分: 用 Memcache 守护程序把数据缓存到内存中
- [转]为 PHP 应用提速、提速、再提速!,第 3 部分: 用 Memcache 守护程序把数据缓存到内存中
- 为 PHP 应用提速、提速、再提速(共三部分)
- 单线程内存池
- 单线程内存池
- 线程安全内存池
- 无锁单线程内存池
- 大容量内存的电脑提速技巧
- 扩展Windows 7内存 巧用ReadyBoost提速
- 内存设置好可以为电脑提速
- 内存设置好可以为电脑提速
- 内存设置好可以为电脑提速
- dlmalloc、nedmalloc
- mysql 同步出错 快速恢复
- 线程关联的内存池
- 安装原版WINXP出现***STOP 0X0000007B错误的解决方案
- 设计模式之-----Bridge
- 线程关联内存池再提速
- 不使用任何中间变量计算一个字符串的长度
- Hibernate 的关系映射1 Many2Many
- c#泛型和反射的设计应用(一)
- 查看页面是否是php写的
- *.LDB文件介绍(转)
- ubuntu 执行shell出现cd命令不能执行的解决方案
- Linux下打包压缩解压
- 手机移动办公的意义