针对磁盘查找的核心数据提取性能

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

【讨论】:

以上是关于针对磁盘查找的核心数据提取性能的主要内容,如果未能解决你的问题,请参考以下文章

从磁盘转储中提取 jpeg

最佳核心数据保存策略(何时将数据保存到磁盘)

为什么NoSql快--磁盘顺序写

linux磁盘配额可以通过哪两种方法对用户进行限制?

24 基于mmap内存映射实现磁盘文件的高性能读写

磁盘性能测试工具之fio