针对磁盘查找的核心数据提取性能
Posted
技术标签:
【中文标题】针对磁盘查找的核心数据提取性能【英文标题】:Performance of Core Data Fetch against Disk Lookup 【发布时间】:2012-11-22 18:39:04 【问题描述】:我想知道是否有人对性能更好的方法有所了解:获取核心数据或在磁盘上查找文件。
我的情况是下载记录,每条记录都有一个与之相关的图像。但是不同的记录可以有相同的图像,所以我不想下载图像两次。我将图像保存到磁盘并使用 NSManagedObject 保存 Web url 和本地文件路径。
为了避免再次拨打网络电话,我可以
A:执行核心数据获取,看看我是否已经有基于 web url 的图像
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Image class])];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"web_url == %@", myRecord.image_url];
B:从本地文件路径查找磁盘上的图片数据
NSFileManager *fileManager = [NSFileManager defaultManager];
NSData *photoData = [fileManager contentsAtPath:myRecord.photo_path];
另外,Instruments 中有什么东西可以让我对这些进行计时吗?这将是一个方便的工具,知道如何在未来使用。谢谢。
【问题讨论】:
【参考方案1】:在这篇 NSHipster 文章 http://nshipster.com/reader-submissions-new-years-2013/ 中提交的用于测量执行时间的宏的帮助下,我终于开始测试了。
正在测试的代码如下
__block NSData *photoData;
const char *caller = "filemanager";
MVComputeTimeWithNameAndBlock(caller, ^
NSFileManager *fileManager = [NSFileManager defaultManager];
photoData = [fileManager contentsAtPath:[self createLocalFilePath:myRecord.photo_path]];
);
caller = "coredata";
MVComputeTimeWithNameAndBlock(caller, ^
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Image class])];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"web_url == %@", myRecord.image_url];
NSError *error;
NSArray *arr = [[self managedObjectContext] executeFetchRequest:fetchRequest error:&error];
if([arr count])
Image *photo = arr[0];
);
2013-01-25 14:31:06.359 FormulaOne[26554:12b03] 文件管理器 - 运行时间为:0.000325 2013-01-25 14:31:06.359 FormulaOne[26554:12b03] coredata - 运行时间为:0.000491 2013-01-25 14:31:11.958 FormulaOne [26554:12b03] 文件管理器-运行时间为:0.000178 2013-01-25 14:31:11.959 FormulaOne[26554:12b03] coredata - 运行时间为:0.000417 2013-01-25 14:31:14.840 FormulaOne [26554:12b03] 文件管理器-运行时间为:0.000187 2013-01-25 14:31:14.841 FormulaOne[26554:12b03] coredata - 运行时间为:0.000421 2013-01-25 14:33:10.869 FormulaOne [26554:12b03] 文件管理器-运行时间为:0.000193 2013-01-25 14:33:10.870 FormulaOne[26554:12b03] coredata - 运行时间为:0.000540 2013-01-25 14:33:13.087 FormulaOne [26554:12b03] 文件管理器-运行时间为:0.000170 2013-01-25 14:33:13.088 FormulaOne[26554:12b03] coredata - 运行时间为:0.000392
我换成了
int count = [[self managedObjectContext] countForFetchRequest:fetchRequest error:&error];
因为我实际上并不需要这个对象,我只需要知道它的存在。时机实际上更糟。
2013-01-25 14:36:27.760 FormulaOne[28209:12b03] 文件管理器 - 运行时间为:0.000346 2013-01-25 14:36:27.761 FormulaOne[28209:12b03] coredata - 运行时间为:0.000601 2013-01-25 14:36:29.978 FormulaOne [28209:12b03] 文件管理器-运行时间为:0.000182 2013-01-25 14:36:29.979 FormulaOne[28209:12b03] coredata - 运行时间为:0.000479 2013-01-25 14:36:31.585 FormulaOne [28209:12b03] 文件管理器-运行时间为:0.000265 2013-01-25 14:36:31.586 FormulaOne[28209:12b03] coredata - 运行时间为:0.000400 2013-01-25 14:36:34.923 FormulaOne [28209:12b03] 文件管理器-运行时间为:0.000307 2013-01-25 14:36:34.924 FormulaOne[28209:12b03] coredata - 运行时间为:0.001055 2013-01-25 14:36:36.038 FormulaOne [28209:12b03] 文件管理器-运行时间为:0.000318 2013-01-25 14:36:36.040 FormulaOne[28209:12b03] coredata - 运行时间为:0.000740
【讨论】:
以上是关于针对磁盘查找的核心数据提取性能的主要内容,如果未能解决你的问题,请参考以下文章