slice内存分配如何起作用?
我写了个简单的例子来测试g_slice_alloc()和g_malloc()的性能
代码
slice版本
#include <gtk/gtk.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
gchar *mem[1000000];
gint i;
for(i=0;i<1000000;i++){
gint j=i>10000?10000:i;
mem[i]=g_slice_alloc(j);
}
for(i=0;i<1000000;i++){
gint j=i>10000?10000:i;
g_slice_free1(j,mem[i]);
}
return 0;
}
malloc版本
#include <gtk/gtk.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
gchar *mem[1000000];
gint i;
for(i=0;i<1000000;i++){
gint j=i>10000?10000:i;
mem[i]=g_malloc(j);
}
for(i=0;i<1000000;i++){
gint j=i>10000?10000:i;
g_free(mem[i]);
}
return 0;
}
运行
然后分别运行这两个程序
$ time ./slice
real 0m1.531s
user 0m0.310s
sys 0m1.220s
$ time ./malloc
real 0m1.532s
user 0m0.276s
sys 0m1.252s
结果
结果显示两个程序的速度是非常接近的,多次运行后发现有时这个快点,有时那个快点,属于正常的浮动。基本上就是两者的运行速度是没什么差别的。
问题
如果是这样的话,那么slice存在的意义是什么?这个测试例子已经分配了非常大量的内存了,性能居然和malloc一样。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在stackoverflow上找到答案,翻译过来,略加描述。
glibc的malloc以前确实是众所周知的慢,因此加入了GSlice。但自那之后glibc的malloc已经优化了很多。
GSlice以前确实比malloc快很多,但现在的malloc 因为已经优化过了,已经比以前快很多了,尤其在线程很多的应用程序中。 而gslice在加入之后就没有实质性地更改过。
据我所知,现在使用gslice的唯一原因就是它在不同平台上都相当稳定(良好的跨平台性)。 Windows上的malloc对于GStreamer来说实在太慢了。
所有的这些都表明,你所做的测试不是一个很好的测试。slab类型的内存分配器,如gslice通常是用来减少,因大量不同大小的内存分配、释放而造成的内存碎片。你所作的只是分配大量内存然后释放它(并没有测试内存碎片的情况)。类似gslice这样的分配器,在分配相同大小的内存时才有效。