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...
即使在速度上的差异可能非常小,技术上,有没有性能差异?
C是最快的。
C:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
userName=[defaults objectForKey:@"userName"];
userEmail=[defaults objectForKey:@"userEmail"];
userId=[[defaults objectForKey:@"userId"] intValue];
无感调用同一方法一遍又一遍,当你可以在本地缓存结果和重用。方法调用总是比访问局部变量慢。
虽然*可能*更快,但不能保证。 ' - [NSUserDefaults objectForKey:]'可能与[ - [NSDictionary objectForKey:]'有不同的(更差的)性能特征。 – 2012-04-06 18:27:02
哦,等等[defaults objectForKey ..“]与[NSUserDefaults standardUserDefaults]不一样..不知道.. – Snowman 2012-04-06 18:27:12
@mohabitar'[NSUserDefaults standardUserDefaults]'返回类'NSUserDefaults'的一个实例。你将结果缓存到局部变量,访问局部变量会比调用一个方法获得相同的值更快。 – 2012-04-06 18:54:03
技术上,是的。但是推测哪一个更快是不明智的。第一遍猜测可能是A更快,因为它只在散列表中执行三次查找,而不是四次。但+[NSUserDefaults standardUserDefaults]
也许使用一个锁使自己线程安全,也许这种开销足以使B更快。作为奖励,iOS版本可能会更快,而另一个版本可能更快。
区别是不可预测的,并且令人难以置信的可以忽略不计。使用哪个代码更简单。
算法和宏观范围,这是一个非常可怕的答案。 – Katushai 2014-06-03 21:24:16
你的性能测试表明了什么? (答案是,顺便说一句,通常是肯定的,但是没有这样的要求,编译器可以在合法的情况下优化它,只有测试会告诉你不同。) – 2012-04-06 18:23:45
如何运行性能测试? (另外,我想知道“为什么”而不是仅仅是或否,我不能回答) – Snowman 2012-04-06 18:25:28
通过放入一个循环并运行一百万次左右并计时。至于“为什么”,第一个请求多次调用方法,这比不调用该方法更昂贵。编译器可以对其进行优化。 Clang不能真正优化它,因为它不知道你在运行时没有用一个带副作用的方法替换'standardUserDefaults'。所以在实践中,它不能真正被优化,你必须打电话。但这通常是性能问题的错误方法。总是从测试开始。 – 2012-04-06 18:28:59