NSUserDefaults 导致性能问题
NSUserDefaults causing performance issues
我相信我有 CPU 过度使用 NSUserDefaults 导致的性能问题。这可能吗?
我正在调试一些使用它来存储大量用户数据的代码,现在每次调用存储数据的后续调用都超过 4 秒。
什么会导致这些长时间的延迟?
// Save data in user defaults
NSDate *timerStartTime = [NSDate date];
NSLog(@"Data Size %lu", (unsigned long)[result.data length]);
[self setObject:result.data forKey:defaultName];
NSTimeInterval elapsed = [[NSDate date] timeIntervalSinceDate:timerStartTime];
NSLog(@"Time For Function: %f", elapsed);
输出:
Time For Function: 4.1
如果你要存储大量数据,你绝对不应该使用 NSUserDefaults 来这样做。
NSUserDefaults 适用于标志、简单设置或用户变量(如昵称)等。本质上是用户偏好。
这是因为:
- NSUserDefaults 每次加载时都会完整加载和保存。
- NSUserDefaults 在应用程序启动时加载,因此您不能
线程其加载过程。
应该使用 Core Data 来存储数据:
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/cdProgrammingGuide.html
或者,如果它只是一个字典或字符串数组,您可以使用 属性 列表:
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/PropertyLists/Introduction/Introduction.html
NSUserDefaults 确实使用 pList 来存储其数据,因此您会遇到一些相同的限制,但您将对何时以及如何写入或读取数据有更多的控制权。此外,当 NSUserDefaults 具有预期的偏好目的时,将 NSUserDefaults 用作临时数据库也不是好的做法。
我相信我有 CPU 过度使用 NSUserDefaults 导致的性能问题。这可能吗?
我正在调试一些使用它来存储大量用户数据的代码,现在每次调用存储数据的后续调用都超过 4 秒。
什么会导致这些长时间的延迟?
// Save data in user defaults
NSDate *timerStartTime = [NSDate date];
NSLog(@"Data Size %lu", (unsigned long)[result.data length]);
[self setObject:result.data forKey:defaultName];
NSTimeInterval elapsed = [[NSDate date] timeIntervalSinceDate:timerStartTime];
NSLog(@"Time For Function: %f", elapsed);
输出:
Time For Function: 4.1
如果你要存储大量数据,你绝对不应该使用 NSUserDefaults 来这样做。
NSUserDefaults 适用于标志、简单设置或用户变量(如昵称)等。本质上是用户偏好。
这是因为:
- NSUserDefaults 每次加载时都会完整加载和保存。
- NSUserDefaults 在应用程序启动时加载,因此您不能 线程其加载过程。
应该使用 Core Data 来存储数据: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/cdProgrammingGuide.html
或者,如果它只是一个字典或字符串数组,您可以使用 属性 列表: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/PropertyLists/Introduction/Introduction.html
NSUserDefaults 确实使用 pList 来存储其数据,因此您会遇到一些相同的限制,但您将对何时以及如何写入或读取数据有更多的控制权。此外,当 NSUserDefaults 具有预期的偏好目的时,将 NSUserDefaults 用作临时数据库也不是好的做法。