2012-04-06 117 views
1

有以下兩種情況之間的速度差:NSUserDefaults的性能比較

答:

userName=[[NSUserDefaults standardUserDefaults] objectForKey:@"userName"]; 
userEmail=[[NSUserDefaults standardUserDefaults] objectForKey:@"userEmail"]; 
userId=[[[NSUserDefaults standardUserDefaults] objectForKey:@"userId"] intValue]; 

B:

userDictionary=[[NSUserDefaults standardUserDefaults] objectForKey:@"userDictionary"]; 
userName=[userDictionary objectForKey:@"name"]; 
userEmail=...etc... 

即使在速度上的差異可能非常小,技術上,有沒有性能差異?

+0

你的性能測試表明瞭什麼? (答案是,順便說一句,通常是肯定的,但是沒有這樣的要求,編譯器可以在合法的情況下優化它,只有測試會告訴你不同。) – 2012-04-06 18:23:45

+0

如何運行性能測試? (另外,我想知道「爲什麼」而不是僅僅是或否,我不能回答) – Snowman 2012-04-06 18:25:28

+0

通過放入一個循環並運行一百萬次左右並計時。至於「爲什麼」,第一個請求多次調用方法,這比不調用該方法更昂貴。編譯器可以對其進行優化。 Clang不能真正優化它,因爲它不知道你在運行時沒有用一個帶副作用的方法替換'standardUserDefaults'。所以在實踐中,它不能真正被優化,你必須打電話。但這通常是性能問題的錯誤方法。總是從測試開始。 – 2012-04-06 18:28:59

回答

4

C是最快的。

C:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
userName=[defaults objectForKey:@"userName"]; 
userEmail=[defaults objectForKey:@"userEmail"]; 
userId=[[defaults objectForKey:@"userId"] intValue]; 

無感調用同一方法一遍又一遍,當你可以在本地緩存結果和重用。方法調用總是比訪問局部變量慢。

+1

雖然*可能*更快,但不能保證。 ' - [NSUserDefaults objectForKey:]'可能與[ - [NSDictionary objectForKey:]'有不同的(更差的)性能特徵。 – 2012-04-06 18:27:02

+0

哦,等等[defaults objectForKey ..「]與[NSUserDefaults standardUserDefaults]不一樣..不知道.. – Snowman 2012-04-06 18:27:12

+0

@mohabitar'[NSUserDefaults standardUserDefaults]'返回類'NSUserDefaults'的一個實例。你將結果緩存到局部變量,訪問局部變量會比調用一個方法獲得相同的值更快。 – 2012-04-06 18:54:03

1

技術上,是的。但是推測哪一個更快是不明智的。第一遍猜測可能是A更快,因爲它只在散列表中執行三次查找,而不是四次。但+[NSUserDefaults standardUserDefaults]也許使用一個鎖使自己線程安全,也許這種開銷足以使B更快。作爲獎勵,iOS版本可能會更快,而另一個版本可能更快。

區別是不可預測的,並且令人難以置信的可以忽略不計。使用哪個代碼更簡單。

+0

算法和宏觀範圍,這是一個非常可怕的答案。 – Katushai 2014-06-03 21:24:16