任何线程不安全的malloc
Any thread-unsafe mallocs?
我需要一个线程不安全的无锁malloc,以便在单线程应用程序中使用它。我希望能因此获得一点性能提升。我需要它在win和linux上,它必须保证是单线程的。什么好主意吗?
您是否实际分析了您的代码并显示它在malloc
中花费了很大一部分时间?我想说的是,与其使用malloc,不如先考虑另一种不需要动态分配的算法。如果这不是一个选择,我会考虑内存池的方法(他们可以非常快的固定大小的块)。
为了回答这个问题,一些实现有编译器选项来从malloc中删除线程安全。这个答案是:malloc线程安全吗?建议可以将NO_THREADS
定义为从malloc中删除线程安全性,但我还没有测试过。
你应该听听其他的帖子,然而,它不太可能是开始你的优化的最好的地方。
单线程应用程序中线程安全的malloc
(如果存在)的开销对于从操作系统分配内存所需的时间来说很可能是微不足道的。请先分析程序中的瓶颈,然后再开始优化
一种方法是自己分配一个内存池,然后在其中进行本地分配(参见内存池)。正如评论所指出的,malloc
已经很聪明了,所以基准测试很重要。
您是否分析了您的代码并看到malloc()
确实是花费时间的地方?我只是想检查,以确保,但如果malloc()
是瓶颈,有一些事情可以做关于它。
首先,我不认为线程锁定是问题。
malloc()
的主要问题是内存碎片,特别是在长时间运行的应用程序进行大量分配和释放时。malloc()
的基本任务是查看可用的内存块,并搜索一个足够大的内存块来满足请求的大小。当找到这样的块时,使用所需的部分,其余部分被标记为空闲块。在大量分配之后,这可能导致内存碎片,其中空闲内存被分割成大量的小块。在这些块中搜索一个空闲的、足够大的块是导致性能问题的一个常见原因。
有一个可以实现的策略来纠正这个问题:
- 总是分配一个大小为2的幂的内存块,四舍五入到最近的边界。这可以防止碎片化。
- 为应用程序中常用的块大小创建自己的分配机制,比如一次分配100个结构体。Wikipedia有一篇关于内存池的文章。
相关文章:
- C++/CLI 和 C#/VB 与不安全和外部有什么区别?
- 问:Apache Arrow 数组生成器不安全追加
- 不安全的 MPI 非阻塞通信示例?
- 有没有一种简单的方法来检查C++中的不安全表达式
- 为什么静态向下转换unique_ptr不安全?
- 哪些整数操作不安全
- 为什么这个递归 lambda 函数不安全?
- 解决方法:QPixmap:在GUI线程之外使用pixmap是不安全的
- 正在匹配不安全的正则线程
- 如何修复编译错误"此函数或变量可能不安全"(strcpy)
- 编译器在 const ref 类型参数上使用临时对象时是否应该警告不安全的行为?
- 实现没有不安全服务器凭据的自定义 AuthMetadataProcessor
- 什么时候关闭__strict_ansi__标志是不安全的
- 原子对象在普通对象安全的任何上下文中都是不安全的
- OpenSSL:将不安全的BIO提升为安全
- 这是对支撑初始器列表的不安全使用情况
- 从 C# 到C++和返回的数组,没有不安全的代码
- 一个线程设置成员,而另一个循环上方 - 是此螺纹 - 不安全
- 访问"std::variant"的不安全、"noexcept"和无开销方式
- 任何线程不安全的malloc