- 浏览: 246961 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
satan_1st:
据说可以用(*this)取得当前的lambda。
Recursive Lambda in C++ -
febird:
微软不死, 天理难容
再抱怨一下Windows7 -
sunzixun:
很有见解ace也可以精简的,我们就用阉割版的
asio/ACE/apr/libevent -
febird:
hamo2008 写道用win7以来基本上没有遇到这种情况了我 ...
造 windows 的微软很脑残 -
hamo2008:
用win7以来基本上没有遇到这种情况了
造 windows 的微软很脑残
mpool.h
mpool.c
BenchMark
#include <vector>
#include <febird/c/mpool.h>
#include <febird/profiling.h>
void bench(int n)
{
using namespace std;
std::allocator<sample_data> stdal;
struct fixed_mpool fmp = {0};
fmp.cell_size = sizeof(sample_data);
fmp.chunk_size = 8192;
fmp.nChunks = 1024;
fixed_mpool_init(&fmp);
febird::profiling prof;
vector<sample_data*> vp0(n), vp1(n);
long long t0, t1, t2, t3, t4, t5, t6;
t0 = prof.current();
for (int i = 0; i+3 < n; i+=4)
{
vp0[i+0] = stdal.allocate(1);
vp0[i+1] = stdal.allocate(1);
vp0[i+2] = stdal.allocate(1);
vp0[i+3] = stdal.allocate(1);
}
t1 = prof.current();
for (int i = 0; i+3 < n; i+=4)
{
vp1[i+0] = (sample_data*)fixed_mpool_alloc(&fmp);
vp1[i+1] = (sample_data*)fixed_mpool_alloc(&fmp);
vp1[i+2] = (sample_data*)fixed_mpool_alloc(&fmp);
vp1[i+3] = (sample_data*)fixed_mpool_alloc(&fmp);
}
t2 = prof.current();
for (int i = 0; i+3 < n; i+=4)
{
stdal.deallocate(vp0[i+0], sizeof(sample_data));
stdal.deallocate(vp0[i+1], sizeof(sample_data));
stdal.deallocate(vp0[i+2], sizeof(sample_data));
stdal.deallocate(vp0[i+3], sizeof(sample_data));
}
t3 = prof.current();
for (int i = 0; i+3 < n; i+=4)
{
fixed_mpool_free(&fmp, vp1[i+0]);
fixed_mpool_free(&fmp, vp1[i+1]);
fixed_mpool_free(&fmp, vp1[i+2]);
fixed_mpool_free(&fmp, vp1[i+3]);
}
t4 = prof.current();
for (int i = 0; i < n; ++i)
{
stdal.deallocate(stdal.allocate(1), sizeof(sample_data));
}
t5 = prof.current();
for (int i = 0; i < n; ++i)
{
fixed_mpool_free(&fmp, fixed_mpool_alloc(&fmp));
}
t6 = prof.current();
printf("alloc[std=%lld, my=%lld, std/my=%f], free[std=%lld, my=%lld, std/my=%f], alloc+free[std=%lld, my=%lld, std/my=%f]\n"
, prof.us(t0,t1), prof.us(t1,t2), (double)prof.us(t0,t1)/prof.us(t1,t2)
, prof.us(t2,t3), prof.us(t3,t4), (double)prof.us(t2,t3)/prof.us(t3,t4)
, prof.us(t4,t5), prof.us(t5,t6), (double)prof.us(t4,t5)/prof.us(t5,t6)
);
fixed_mpool_destroy(&fmp);
}
int main(int argc, char* argv[])
{
bench(1000000);
return 0;
}
Windows7 + visual C++ 2008
time in us |
std::allocator(new/delete) |
fixed_mpool |
fast ratio |
alloc |
93901 |
15416 |
6.091139 |
free |
70657 |
7374 |
9.581909 |
alloc+free |
131739 |
9297 |
14.170055 |
Linux
uname:
Linux 2.6.9-78.ELsmp #1 SMP Wed Jul 9 15:46:26 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux
time in us |
std::allocator(pooled) |
fixed_mpool |
fast ratio |
alloc |
92779 |
26734 |
3.470450 |
free |
42564 |
17224 |
2.471203 |
alloc+free |
50089 |
9088 |
5.511554 |
评论
16 楼
mathgl
2010-04-08
单线程也没啥不好。。用co routine 用消息传递 信息好了嘛...
15 楼
huxk
2010-04-07
樓主非常牛逼
14 楼
Arath
2009-12-02
febird 写道
目前不支持多线程,keep it simple stupid.
多线程需要考虑的东西太多了,每次alloc/free都加锁,开销太大,仅在溢出时才加锁,又太复杂。真需要多线程,还是用通用的。
多线程需要考虑的东西太多了,每次alloc/free都加锁,开销太大,仅在溢出时才加锁,又太复杂。真需要多线程,还是用通用的。
如果这样,那么应用的范围就会小很多,类似bucket的memory pool实现挺多,一般都是考虑多线程的.
不过能动手自己做一个,总是好的~
btw,我也喜欢自己在程序中自己写memory pool,一个吗是买商业的太贵,二则也是觉得自己写一个用起来方便。
另外还有一个很大的好处,可以把memory的错误统一处理掉,上层代码可以简练很多.
13 楼
febird
2009-12-02
目前不支持多线程,keep it simple stupid.
多线程需要考虑的东西太多了,每次alloc/free都加锁,开销太大,仅在溢出时才加锁,又太复杂。真需要多线程,还是用通用的。
多线程需要考虑的东西太多了,每次alloc/free都加锁,开销太大,仅在溢出时才加锁,又太复杂。真需要多线程,还是用通用的。
12 楼
Arath
2009-12-02
lz可以做一下多线程下的效率测试.
简单说定制的memory pool肯定是最快的,但是通用的因为考虑的东西多所以效率上肯定要差一点.
而且自己写的memory pool缺乏自我调适机制,会让你的程序在排查leak的时候增加难度.
简单说定制的memory pool肯定是最快的,但是通用的因为考虑的东西多所以效率上肯定要差一点.
而且自己写的memory pool缺乏自我调适机制,会让你的程序在排查leak的时候增加难度.
11 楼
febird
2009-12-02
sunzixun 写道
mp->max_cell_size = (mp->max_cell_size + MPOOL_MIN_CELL - 1) / MPOOL_MIN_CELL * MPOOL_MIN_CELL;
为什么要 除以 2次 MPOOL_MIN_CELL?
对齐到 MPOOL_MIN_CELL,整数除一次乘一次就把余数去掉了
10 楼
sunzixun
2009-12-02
mp->max_cell_size = (mp->max_cell_size + MPOOL_MIN_CELL - 1) / MPOOL_MIN_CELL * MPOOL_MIN_CELL;
为什么要 除以 2次 MPOOL_MIN_CELL?
9 楼
febird
2009-11-10
iunknown 写道
我觉得可以整理一下,到 google code 上面去建立一个项目吧。
已经在 http://code.google.com/p/febird 上了,其中还有其它很多好东西
http://code.google.com/p/febird/source/browse/trunk/febird/src/febird/c/mpool.c
http://code.google.com/p/febird/source/browse/trunk/febird/src/febird/c/mpool.h
另有针对 std::allocator concept 的包装和 allocator to sallocator bridge,代码都很短:
http://code.google.com/p/febird/source/browse/trunk/febird/src/febird/mpoolxx.h
febird.trb 使用 mpool的测试程序:
http://code.google.com/p/febird/source/browse/trunk/febird/vcproj/test_trb/test_trb_cxx.cpp
8 楼
febird
2009-11-10
whaosoft 写道
快的不少 不过稳定吗? 在多多测试下~!
就lz的劳动成果 表示佩服 呵呵
就lz的劳动成果 表示佩服 呵呵
目前很稳定,在febird.trb_tree 中的应用取得了非常好的效果,cache命中率比malloc/free/std::allocator 高很多——从测试程序的查找bench可以看出来!
{map|set|tab|strmap}但是,从设计之初,为了性能,我决定不支持多线程,因为一牵涉到线程,就太dirty了。
代码已有更新,在google code上了
http://code.google.com/p/febird/source/browse/trunk/febird/src/febird/c/mpool.c
http://code.google.com/p/febird/source/browse/trunk/febird/src/febird/c/mpool.h
另有针对 std::allocator concept 的包装和 allocator to sallocator bridge,代码都很短:
http://code.google.com/p/febird/source/browse/trunk/febird/src/febird/mpoolxx.h
febird.trb 使用 mpool的测试程序:
http://code.google.com/p/febird/source/browse/trunk/febird/vcproj/test_trb/test_trb_cxx.cpp
7 楼
whaosoft
2009-11-07
快的不少 不过稳定吗? 在多多测试下~!
就lz的劳动成果 表示佩服 呵呵
就lz的劳动成果 表示佩服 呵呵
6 楼
rrsy23
2009-11-06
测试要充分哦;还是支持哈!
希望真的快一倍
但是不能简单测试开一倍
我做java的我写个简单的远程访问绝对比现在很多流行的快10倍
但是功能就,容错就
支持,但是要仔细
希望真的快一倍
但是不能简单测试开一倍
我做java的我写个简单的远程访问绝对比现在很多流行的快10倍
但是功能就,容错就
支持,但是要仔细
5 楼
iunknown
2009-11-06
我觉得可以整理一下,到 google code 上面去建立一个项目吧。
4 楼
febird
2009-10-24
linkerlin 写道
又一个轮子。
有好轮子可用,我不会去再发明。我需要一个C版的mpool,stlport.mpool不错,只可惜是C++版的。其它的:apache.apr.mpool, nginx.mpool,还有其它几个不知名的,都没有达到我期望的功能和性能。它们都没有体现剃刀原理。最小功能集,最大约束集,其结果就是最高性能级。
3 楼
febird
2009-10-24
mathgl 写道
请问 怎么个高效法? 有benchmark么?
比 gcc.stl.pool_allocator 快一倍
2 楼
mathgl
2009-10-23
请问 怎么个高效法? 有benchmark么?
1 楼
linkerlin
2009-10-23
又一个轮子。
发表评论
-
对数复杂度的聚集算法
2010-08-05 18:24 682SQL 有5个标准聚集函数:SUM, AVG, MIN, MA ... -
使用 std::map 查找 IP 范围
2010-08-05 17:40 1956给定这样一个问题: 有一组从IP范围到地理位置信息的数据 ... -
tcmalloc 要点
2010-02-22 11:33 1446google.tcmalloc 线程缓存(th ... -
my PipelineProcessor
2010-02-01 15:43 668刚看到,intel tbb::pipeline 实现的功能,和 ... -
简单的代码生成器创建领域语言
2010-02-01 14:30 1184有一类问题,代码模板相同,但有少部分地方不同,一般可以写一个复 ... -
理想的 lazy load
2010-01-12 20:21 716在linux中碰到一个问题,可以描述如下 编译 liba.s ... -
字符串基数排序
2009-12-09 22:00 1775对字符串使用基数排序,以前,我一直觉得:因为字符串的长度不 ... -
内嵌变长数据结构范例——trbstrmap<mapped>
2009-11-03 17:43 774以前的这篇文章介绍了嵌入的变长数据结构(embeded ... -
memory pool 的高效实现
2009-10-23 02:40 2734memory pool malloc可以分配任意大小的内存, ... -
可变长度数据结构
2009-09-27 17:12 1025固定长度的数据结构很简单,大家每天都在用。 可变长度数据结构 ... -
malloc/free 的开销,如何去掉这种开销?
2009-10-18 15:58 1799一般的malloc实现,对一块已分配的内存,都有两个机器字的簿 ... -
世界上应用最广泛的虚拟机是啥?
2009-10-18 16:19 816别说是JavaVM! 正确答案:x86vm x86本身是一 ... -
memory FILE in C
2009-06-30 17:18 942<script>function StorePag ... -
很基本也很诡异的fread, feof
2009-07-03 18:12 2955先看一段非常简单的程序: #include & ... -
Threaded Red-Black Tree 线索红黑树
2009-05-26 19:19 828项目地址:http://code.google.com/p/f ... -
C 语言实现的 stl-like 算法
2009-04-08 10:46 995使用类似BOOST.PP技巧,自动生成代码,效率上小胜stl, ... -
使用" 参数化基类" 和" 成员函数指针" 模拟实现虚函数--在实际中的应用
2005-12-02 23:01 1113// 使用" 参数化基类" 和" ... -
千万注意,不要 hack std::string
2007-02-25 14:49 1023前段时间被一个bug折磨了两个星期,最后发现竟然是如此一个陷阱 ... -
一个很强大的Comparator生成器
2008-04-22 15:02 654项目地址:http://code.goog ... -
通用的 LoserTree
2008-04-22 15:14 1306项目地址:http://code.google.com/p/f ...
相关推荐
Linux下一个内存池的简单实现, C语言
C++内存池完整代码memory_pool Makefile
C++ 内存池完整 memory_pool
内存池(memory pool)是代替直接调用malloc/free、new/delete进行内存管理的常用方法,当我们申请内存空间时,首先到我们的内存池中查找合适的内存块,而不是直接向操作系统申请
Memory Pool的设计哲学和无痛运用完整版本,侯捷先生的大作,现在贡献出来给大家下载。
内存管理 /* 一个分配固定大小内存的内存池,使用链表维护 */
只要把四个文件放入到你的项目工程当中去,编译完成之后内存池就会完全接管你申请内存时的NEW,DELETE操作。
此资源文件主要实现了动态查看Cpu利用率以及Memory利用率。在不同的机型上通过top命令查看,有些机型总是为出现一直为0的情况。而此资源另辟蹊径,更大程度上兼容了市面上所有的机型。
对内存池代码 的说明PPT
memory的BIST代码,verilog
高效的固定大小内存池实现。对于想在自己引擎或游戏中实现自定义内存分配器的开发者而言是不可多得的参考资料。
基于.NET4.0的MemoryMappedFile实现共享内存通信 共享内存通信可以解决跨线程、跨进程、跨EXE之间通信的问题 对于需要传输图片等引用类数据,可以通过序列化和反序列化配合共享内存实现跨进程(跨EXE)通信 共享...
programmer-13-memory-pool.pdf
Linux 平台内存池的实现, 一个很好使用的内存池,采用SALB思想,内存采用按块分,非常适用于Linux项目的开发。
有多个flash存储器的源代码,包括Verilog和VHDL的代码。
memory_pool :: borrow ( | aux: & mut String | { aux. push_str ( "Do you like cupcakes?" );});memory_pool :: borrow ( | vec: & mut Vec < u32> | { vec. push ( 1 ); vec. push ( 2 ); vec. push ( 3 );}); ...
代码优化:有效使用内存 Code Optimization: Effective Memory Usage pdf 英文版 清晰,该书中文版翻译质量很差,建议直接读英文版
Apache Web服务器依靠内存池轻松管理内存分配。 该项目提供了一些模板,这些模板将帮助您利用C ++模块中的apache pool。
memory_pool
C语言头文件 MEMORY.HC语言头文件 MEMORY.HC语言头文件 MEMORY.HC语言头文件 MEMORY.HC语言头文件 MEMORY.HC语言头文件 MEMORY.HC语言头文件 MEMORY.HC语言头文件 MEMORY.HC语言头文件 MEMORY.HC语言头文件 MEMORY....