任何线程不安全的mallocs?

时间:2011-07-25 13:10:50

标签: c++ c

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

5 个答案:

答案 0 :(得分:3)

您是否真的对自己的代码进行了分析,并证明它在malloc中占用了大部分时间?我会说,而不是替换malloc,首先考虑一个不做动态分配的替代算法。如果那不是一个选项,我会考虑使用内存池方法(对于固定大小的块,它们可以非常快)。

答案 1 :(得分:2)

单线程应用程序中线程安全malloc(如果存在)的开销很可能与从OS分配内存所需的时间无关。 Please first profile the bottlenecks in your program and then start optimizing.

答案 2 :(得分:1)

一种方法是自己分配一个内存池,然后从内部分配(见memory pool)。正如评论所指出的那样,malloc已经非常聪明,因此基准测试非常重要。

答案 3 :(得分:1)

您是否已对自己的代码进行了分析,并看到malloc()确实是花费时间的地方?我只想检查以确定,但如果malloc()是瓶颈,那么可以采取一些措施。

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

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

可以实施一些正弦策略来解决这个问题:

  • 始终分配一个大小为2的内存块,向上舍入到最近的边界。这可以防止碎片化。
  • 在应用程序中为常用块大小创建自己的分配机制,方法是同时为100个结构分配一串。维基百科有一篇关于Memory pools的文章。

答案 4 :(得分:1)

要回答这个问题,一些实现有编译器选项来从malloc中删除线程安全性。这个答案:Is malloc thread-safe?表明NO_THREADS可以定义为从malloc中删除线程安全性,但我没有对此进行测试。

您应该听其他帖子,但是,它不太可能是开始优化的最佳位置。