我目前正在使用cocos2d,Box2D和Objective-C爲iPad和iPhone製作遊戲。有幾個函數調用而不是單個大函數會帶來任何性能增益/損失?
每次更新都會發生很多事情,需要解決很多問題。
我最近重構了很多我的代碼給幾個小方法,而不是在同一個方法中有數百行代碼。
這樣做是否有任何性能損失? 更少的方法調用會提高性能嗎?
我目前正在使用cocos2d,Box2D和Objective-C爲iPad和iPhone製作遊戲。有幾個函數調用而不是單個大函數會帶來任何性能增益/損失?
每次更新都會發生很多事情,需要解決很多問題。
我最近重構了很多我的代碼給幾個小方法,而不是在同一個方法中有數百行代碼。
這樣做是否有任何性能損失? 更少的方法調用會提高性能嗎?
由於堆棧幀調整和分支,每個函數調用都會產生一個恆定時間(O(1)
)延遲。但是,除非在時間關鍵的循環內進行一百萬次呼叫,否則您不會感覺到這種延遲。
我認爲最好的辦法是編寫最乾淨的代碼,然後然後根據需要優化它 - 在分析器的幫助下。
您可能還想看看這個答案:https://stackoverflow.com/a/4816703/252687內聯函數可以在不影響模塊性的情況下減少上述開銷。
+1我曾經做過一個可以循環數百萬次的樂透模擬器,我曾經在循環中調用了不同的方法,並在其他時間將其作爲一個大代碼塊進行編碼。一個大代碼塊被證明更快,所以這個「然而,除非在時間關鍵循環內進行一百萬次呼叫,否則你不會感覺到延遲。」是現貨。 :) – Ricky
當然,更多的方法調用會導致性能下降。然而,這並不是減少使用的理由,這是以更乾淨的代碼爲代價的早熟優化。個人而言,我會選擇最清晰的最清晰的代碼,讓編譯器進行優化,並在最終配置文件中實現真正的瓶頸。
我曾經是基於單個問題的答案被聘用的,那是我在優化之前進行配置的基礎。 :-)
我曾見過多個較小的函數導致性能更好的代碼,因爲編譯器能夠更好地優化寄存器。不過,高度依賴編程和編程風格。但是總的來說,在現代系統(除了真正的低級微處理器之外),優化這個級別的性能是相反的。更好地構造代碼(通常意味着有相當數量的子例程),以便它更可靠,更易於維護,並更容易發現和解決更多全局性能問題。
在編譯器優化代碼之後,除非您嘗試在CPU密集型計算例程(如DSP或像素級圖像處理)的內部循環中使用方法調度,否則可能不會注意到任何可靠的性能差異。
正如你所做的重構 - 你的時間告訴你什麼? – Mark
查看我的性能帖子,瞭解Objective-C消息發送成本的多少以及與其他任務相比的方式:http://www.learn-cocos2d.com/2011/11/depth-ios-cocos2d -performance-analysis-test-project/ – LearnCocos2D
如果你擔心方法調用的次數而不是你的紋理的大小和類似的東西,我認爲你是在一個好地方:) –