slice内存分配如何起作用?-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

slice内存分配如何起作用?

a123456678 2016-06-07 20:02:08 920

我写了个简单的例子来测试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一样。

分享到
取消 提交回答
全部回答(1)
  • a123456678
    2019-07-17 19:30:56

    在stackoverflow上找到答案,翻译过来,略加描述。

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

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

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

    0 0
+ 订阅

时时分享云计算技术内容,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

推荐文章