NSUserDefaults的性能比较

问题描述:

有以下两种情况之间的速度差: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

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

技术上,是的。但是推测哪一个更快是不明智的。第一遍猜测可能是A更快,因为它只在散列表中执行三次查找,而不是四次。但+[NSUserDefaults standardUserDefaults]也许使用一个锁使自己线程安全,也许这种开销足以使B更快。作为奖励,iOS版本可能会更快,而另一个版本可能更快。

区别是不可预测的,并且令人难以置信的可以忽略不计。使用哪个代码更简单。

+0

算法和宏观范围,这是一个非常可怕的答案。 – Katushai 2014-06-03 21:24:16