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

阅读 5.4k
1 个回答

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

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题