开发者社区> 问答> 正文

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一样。

展开
收起
a123456678 2016-06-07 20:02:08 2004 0
1 条回答
写回答
取消 提交回答
  • 在stackoverflow上找到答案,翻译过来,略加描述。

    glibc的malloc以前确实是众所周知的慢,因此加入了GSlice。但自那之后glibc的malloc已经优化了很多。
    GSlice以前确实比malloc快很多,但现在的malloc 因为已经优化过了,已经比以前快很多了,尤其在线程很多的应用程序中。 而gslice在加入之后就没有实质性地更改过。

    据我所知,现在使用gslice的唯一原因就是它在不同平台上都相当稳定(良好的跨平台性)。 Windows上的malloc对于GStreamer来说实在太慢了。

    所有的这些都表明,你所做的测试不是一个很好的测试。slab类型的内存分配器,如gslice通常是用来减少,因大量不同大小的内存分配、释放而造成的内存碎片。你所作的只是分配大量内存然后释放它(并没有测试内存碎片的情况)。类似gslice这样的分配器,在分配相同大小的内存时才有效。

    2019-07-17 19:30:56
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
内存取证与IaaS云平台恶意行 为的安全监控 立即下载
云服务器ECS内存增强型实例re6全新发布 立即下载
低代码开发师(初级)实战教程 立即下载