任何线程不安全的malloc

Any thread-unsafe mallocs?

本文关键字:malloc 不安全 线程 任何      更新时间:2023-10-16

我需要一个线程不安全的无锁malloc,以便在单线程应用程序中使用它。我希望能因此获得一点性能提升。我需要它在win和linux上,它必须保证是单线程的。什么好主意吗?

您是否实际分析了您的代码并显示它在malloc中花费了很大一部分时间?我想说的是,与其使用malloc,不如先考虑另一种不需要动态分配的算法。如果这不是一个选择,我会考虑内存池的方法(他们可以非常快的固定大小的块)。

为了回答这个问题,一些实现有编译器选项来从malloc中删除线程安全。这个答案是:malloc线程安全吗?建议可以将NO_THREADS定义为从malloc中删除线程安全性,但我还没有测试过。

你应该听听其他的帖子,然而,它不太可能是开始你的优化的最好的地方。

单线程应用程序中线程安全的malloc(如果存在)的开销对于从操作系统分配内存所需的时间来说很可能是微不足道的。请先分析程序中的瓶颈,然后再开始优化

一种方法是自己分配一个内存池,然后在其中进行本地分配(参见内存池)。正如评论所指出的,malloc已经很聪明了,所以基准测试很重要。

您是否分析了您的代码并看到malloc()确实是花费时间的地方?我只是想检查,以确保,但如果malloc()是瓶颈,有一些事情可以做关于它。

首先,我不认为线程锁定是问题。

malloc()的主要问题是内存碎片,特别是在长时间运行的应用程序进行大量分配和释放时。malloc()的基本任务是查看可用的内存块,并搜索一个足够大的内存块来满足请求的大小。当找到这样的块时,使用所需的部分,其余部分被标记为空闲块。在大量分配之后,这可能导致内存碎片,其中空闲内存被分割成大量的小块。在这些块中搜索一个空闲的、足够大的块是导致性能问题的一个常见原因。

有一个可以实现的策略来纠正这个问题:

  • 总是分配一个大小为2的幂的内存块,四舍五入到最近的边界。这可以防止碎片化。
  • 为应用程序中常用的块大小创建自己的分配机制,比如一次分配100个结构体。Wikipedia有一篇关于内存池的文章。