爲了整潔和可重用性,我正在考慮在一個類中放入一堆效用方法。該類不需要任何屬性,因此我將這些方法定義爲類方法;我認爲這是沒有真正的需要有這個類的實例浮動...Obj-C:類方法vs實例方法 - 效率差異?
...或者有嗎?效率有差異嗎? (一個明顯的嗎?)或者調用類方法的行爲與它們是調用類的一部分一樣嗎?
爲了整潔和可重用性,我正在考慮在一個類中放入一堆效用方法。該類不需要任何屬性,因此我將這些方法定義爲類方法;我認爲這是沒有真正的需要有這個類的實例浮動...Obj-C:類方法vs實例方法 - 效率差異?
...或者有嗎?效率有差異嗎? (一個明顯的嗎?)或者調用類方法的行爲與它們是調用類的一部分一樣嗎?
丹丹78總體上有正確的答案。自己衡量你的代碼總是最好的。事實上,對於這個問題,你可能應該按照你想要的方式來實現它,然後進行度量,並且只在顯着減慢你的應用程序時才改變它。
Gavin也是正確的,C函數比類或實例方法更有效。但是,除非你在緊密循環中調用這些方法數百萬次,否則方法與C函數的開銷可能對你的應用程序無關緊要。
但要回答問題,類方法和實例方法之間基本沒有區別。在Objective-C中,類實際上是對象本身,向它們發送消息與向實例對象發送消息相同。每個類基本上都有一個調用類方法的單例對象。
與所有關於效率相關困境的案例一樣,最好的選擇就是從編碼的角度來做有意義的事情 - 儘可能讓代碼儘可能直觀和易於閱讀。如果事實證明某些事情沒有達到預期的速度,那麼應該進行相應的分析和優化。
雖然我不希望在這種情況下有任何區別,但可以創建一個方法的類和實例版本,在循環前後運行一百萬次,然後比較[NSDate date]
調用時代。
實際上,最有效的方法是使它們成爲C函數。每次調用其中一個時,您都會避免Objective-C運行時的開銷。很明顯,基於你的問題的措辭,你不需要額外的狀態,你保留這些實用方法,因爲你正在考慮使他們的類方法無論如何。
當我圍繞像這樣的實用方法時,我大部分時間都使它們成爲C函數,因爲它是最乾淨和最有效的。當我可能用它們來製作一個Objective-C類時,如果它們具有共同的東西,那麼將它們按照這種方式組織起來是有意義的,或者如果我需要保持它們的狀態。
I made a sample project比較調用實例方法類方法或C函數。下面是一些例子輸出:
Class methods: Time to complete: 0.00415796
Single instance: Time to complete: 0.00437099
Using Singleton: Time to complete: 0.071667
Using Global: Time to complete: 0.00534797
Using C function: Time to complete: 0.00302202
,你應該從該得到的主要結論是:差異可以忽略不計;使用儀器來分析實際性能瓶頸。
爲了回到原來的問題,您應該使用類方法,因爲您的方法不依賴於實例可能容納的任何狀態(屬性)。性能明智,這隻能幫助,因爲使用實際的實例意味着你必須以某種方式分配和訪問該實例,這增加了開銷(再次,所有這些都可以忽略不計)。使用C函數將會不明顯更快,但是您將無法像繼承類方法那樣繼承和重寫該C函數。
我的猜測是實例方法比類方法稍快。但這只是一個猜測。但大多數情況下,它們幾乎相同 - 都是類似的動態調用。 –