g_slice真的比malloc快吗

问题描述 投票:0回答:3

GLib 文档建议使用 GLib 切片分配器而不是 malloc:

“对于新编写的代码,建议使用新的 g_slice API 而不是 g_malloc() 等,只要对象在其生命周期内不调整大小,并且分配时使用的对象大小在释放时仍然可用。” -- http://developer.gnome.org/glib/unstable/glib-Memory-Slices.html

但实际上 g_slice 是否比 Windows/Linux malloc 快得多(快到足以保证处理大小和 GLib 预处理器黑客(如

g_slice_new
)的额外麻烦)?我计划在我的 C++ 程序中使用 GLib 来处理 INIish 配置 (
GKeyFile
) 并访问 C++ 中不可用的数据结构,如
GHashTable
,因此 GLib 依赖项无论如何都不重要。

malloc glib
3个回答
6
投票

速度是否足够快是否值得取决于您的应用程序。但他们应该更快。

除了速度之外还有另一个问题,那就是内存碎片和每块开销。 GS切片 让 malloc 处理大型或可变大小的分配,同时更有效地处理已知大小的小对象。


5
投票

Slice API 大量借鉴了 Sun Microsystems 在 20 世纪 80 年代进行的研究,当时称为平板分配。我找不到原始的研究论文,但这里有一个关于它的wikipedia页面,或者你可以直接谷歌搜索“slab分配”。

本质上,它通过促进内存块的重用来消除昂贵的分配/释放操作。它还减少或消除内存碎片。因此,速度并不全是问题,尽管它也应该提高速度。

是否应该使用 - 这取决于......看看 Havoc 的答案 - 他总结得很好。

更新1:

请注意,现代 Linux 内核将 SLAB 分配器作为选项之一,并且通常是默认设置。因此,在这种情况下,

g_slice()
malloc()
之间的差异可能不明显。然而,glib 的目的是跨平台兼容性,因此使用 slice API 可以在一定程度上保证跨平台的性能一致。

更新2:

正如评论者指出的那样,我的第一次更新是不正确的。 SLAB 分配由内核用来为进程分配内存,但

malloc()
使用不相关的机制,因此声称
malloc()
相当于 Linux 上的
g_slice()
是无效的。另请参阅此答案了解更多详细信息。


0
投票

GSlice 实现在 2.76 中被删除,理由是普通内存分配器的性能得到了改进。现在

g_slice_new()
g_slice_free()
只会调用
g_malloc()
g_free()

因此,在新版本上两者没有区别。

参考:https://docs.gtk.org/glib/memory-slices.html

© www.soinside.com 2019 - 2024. All rights reserved.