2010-07-12 53 views
0

我需要使用內存的一個塊來不斷地使用多線程寫入和重寫數據。如果我使用malloc'd數據或NSMutableData,數據將使用@synchronized呈現爲線程安全。iPhone Objective-C,malloc或NSMutableData?

我的問題是更值得推薦的速度?看到我在數據矩陣上運行遞歸計算方程式,我需要儘可能快地分配,檢索和設置數據。

我打算在這方面做我自己的研究,但我想知道如果有人知道副手如果Objective-C NSMutableData的開銷會引入速度挫折?

+0

什麼類型的數據?如果它只是原始類型,那麼除了使用'volatile'關鍵字以外,你可能已經足夠了。 – psychotik 2010-07-12 18:42:33

+0

我不熟悉volatile關鍵字,我試圖查找它,但它是Objective-C還是C特定?請原諒我找到了一個共同的關鍵字,白癡我。我正在研究 – Parad0x13 2010-07-12 19:01:42

回答

1

回覆:psychotik的建議:volatile是C中的一個關鍵字,它基本上告訴編譯器避免優化它所附帶的符號的使用。這對多線程代碼或直接與硬件接口的代碼很重要。但是,對於處理內存塊(來自malloc()NSData)來說,它並不是非常有用。正如psychotik所說,它可以用於諸如int之類的基元或指針(即指針本身,而不是它指向的數據)。不會讓你的數據訪問速度更快,並且實際上可能會通過擊敗編譯器的優化技巧來減慢數據訪問速度。

對於跨線程同步,我認爲,如果您不需要遞歸訪問,或者pthread_mutex設置爲遞歸,則我認爲您的最快投注是OSSpinLock。顧名思義,顧名思義,OSSpinLock就是一個自旋鎖,所以某些使用模式使其效率低於pthread_mutex,但它也非常接近金屬(它基於硬件的原子獲取/設置操作。)

如果您的數據真正被頻繁訪問,以至於擔心鎖定性能,那麼您可能需要避免使用NSData,並且只使用malloc()的一塊內存 - 但是,如果不知道更多關於您的內容試圖完成或你訪問數據的頻率,一個解決方案並不容易表現出來。你能告訴我們更多關於你的意圖嗎?

+0

OSSpinLocks在iOS上有一個錯誤:http://openradar.appspot.com/23896366 – Petr 2016-01-27 08:58:37