5

我正在开发一个多线程插件。当我在相当大的内存块(> 10 MB)上执行 free() 时,带有我的插件的应用程序会暂时减慢太多。(它是一个音频应用程序,音频线程的时间太短了)。我不确定 free() 是否正在使用大量 CPU 或者它阻塞其他线程的时间过长。对 madvice() 的调用似乎做了很多工作。我习惯了 free() 占用的时间不多(当我在 32 位模式下运行时它不会)。

一些信息:OSX 10.8 64 bits plugin & program C++

任何关于如何继续的建议都非常受欢迎。

4

4 回答 4

2

一个明显的建议当然是停止这样做free()(顺便说一句,这应该是deleteC++ 中的某种形式)。

只要您的插件仍然加载并处于活动状态(或者可能“正在运行”),就不要释放内存,当插件不再需要时释放资源。

如果您需要在释放旧缓冲区后重新分配新缓冲区,请想办法重新使用已分配的内存。

于 2013-09-24T13:39:33.357 回答
0

如果您重用内存,也许使用placement new,那么您可以完全摆脱对的调用free/delete

于 2013-09-24T13:40:47.827 回答
0

如果缓冲区大小相同或几乎相同,您可能会受益于延迟释放,而是使用 realloc()。这可能更棘手。

于 2013-09-25T05:29:35.283 回答
0

对于大型分配,我现在使用 vm_allocate(),它似乎不会调用冗长的 madvice()。

由于我使用 vm_allocate() 及其对应的 vm_deallocate() 所有内存释放调用再次快速。

于 2013-12-19T13:02:47.340 回答