我正在使用多線程插件。當我在相當大的內存塊(> 10 MB)上執行free()時,使用我的插件的應用程序暫時變慢。 (它是一個音頻應用程序,音頻線程獲得的時間太少)。 我不確定free()是否使用了大量的CPU,或者它阻塞了其他線程太長。 似乎對madvice()的調用做了很多工作。我習慣於釋放()佔用不多的時間(當我以32位模式運行時,它不會)。免費()阻止其他線程,系統減速
一些信息: OSX 10.8 64位插件&程序 C++
就如何繼續的任何建議都非常歡迎。
我正在使用多線程插件。當我在相當大的內存塊(> 10 MB)上執行free()時,使用我的插件的應用程序暫時變慢。 (它是一個音頻應用程序,音頻線程獲得的時間太少)。 我不確定free()是否使用了大量的CPU,或者它阻塞了其他線程太長。 似乎對madvice()的調用做了很多工作。我習慣於釋放()佔用不多的時間(當我以32位模式運行時,它不會)。免費()阻止其他線程,系統減速
一些信息: OSX 10.8 64位插件&程序 C++
就如何繼續的任何建議都非常歡迎。
當然,一個明顯的建議是停止執行free()
(順便提一句,這應該是C++中的某種形式delete
)。
只要您的插件仍然被加載並處於活動狀態(或者「正在運行」),請不要釋放內存,當插件不再需要時,請釋放資源。
如果您需要在釋放舊數據後重新分配新緩衝區,請改爲使用已分配內存的方式。
+1這就是我最終在同步實時視頻播放器中做到這一點的方式。 –
我希望我能做到這一點,我的記憶需求取決於選擇的預設很多。 – jankoen
如果您重複使用內存,也許放置new
,那麼您可以完全清除對free/delete
的呼叫。
如果緩衝區大小相同或差不多,那麼您可以從延遲空閒中受益,而使用realloc()。這可能會更棘手。
對於大型分配,我現在使用vm_allocate(),它似乎沒有調用冗長的madvice()。
由於我使用vm_allocate()及其對應的vm_deallocate(),所有釋放呼叫的內存都會再次變快。
也許free會花費太多時間,因爲它會清除內存以用於調試目的。獲得免費的版本,不這樣做.. –
你可以儀表程序 - 在OS X上,使用儀器真的很容易。這會告訴你你的程序在哪裏花費大部分時間。 – parry
您應該避免在任何實時優先級音頻回調線程上分配內存或解除分配。請參閱[技術問答QA1467:CoreAudio重載警告](https://developer.apple.com/library/mac/qa/qa1467/_index.html)中的建議。 malloc實現爲線程安全獲取鎖。 –