【发布时间】:2014-04-07 05:07:09
【问题描述】:
在我们的一个应用程序中,我被要求记录图像的最后修改日期。这样我就可以与服务器检查某个图像是否已更改并相应地更新我的缓存。
我的第一种方法是访问文件属性并进行比较,但网上的一些地方提到了延迟方面的严重瓶颈。
我的第二个选择是创建一个 SQLite 表来管理它。 (使用fmdb)
我决定编写一个简单的延迟测试。在下一个测试中,我将访问 500 个文件属性和 500 个 sqlite 记录:
- (void)latencyTest
{
NSMutableArray *arrayTest1 = [[NSMutableArray alloc]init];
NSMutableArray *arrayTest2 = [[NSMutableArray alloc]init];
FMResultSet *results = [_database executeQuery:@"SELECT * FROM `tb_media`"];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"dd-MM-yyyy HH:mm:ss:SSS"];
NSLog(@"Time1: %@",[formatter stringFromDate:[NSDate date]]);
int i=1;
while(i<501)
{
NSString *test = [NSString stringWithFormat:@"%@/_media/media/19/%d.jpg",_outputPath,i];
NSDictionary *attributes = [[NSFileManager defaultManager] attributesOfItemAtPath:test error:nil];
NSDate *dateX = [attributes fileModificationDate];
[arrayTest1 addObject:dateX];
i++;
}
NSLog(@"Time2: %@",[formatter stringFromDate:[NSDate date]]);
while([results next])
{
NSDate *myDate = [NSDate dateWithTimeIntervalSince1970:[results intForColumn:@"last_update"]];
[arrayTest2 addObject:myDate];
}
NSLog(@"Time3: %@",[formatter stringFromDate:[NSDate date]]);
}
结果:
//iPhone 5 (Actual Device) 500 Pics
Files Start: 05-03-2014 09:31:20:375
Files End & Sqlite start: 05-03-2014 09:31:20:491
Sqlite end: 05-03-2014 09:31:20:507
Files Start: 05-03-2014 09:31:56:305
Files End & Sqlite start: 05-03-2014 09:31:56:421
Sqlite end: 05-03-2014 09:31:56:437
Files Start: 05-03-2014 09:32:19:053
Files End & Sqlite start: 05-03-2014 09:32:19:170
Sqlite end: 05-03-2014 09:32:19:187
如您所见,结果几乎相同。 我的问题是:
我假设使用
attributesOfItemAtPath一次访问一个文件会 比sql要长很多。我错过了什么吗?attributesOfItemAtPath是否真的在访问文件或 iOS 文件系统将所有属性保存在某种数据库中 方便吗?在看到上述结果后,我决定使用
attributesOfItemAtPath方法。还有什么我不是的 考虑传递 sqlite?
【问题讨论】:
-
我不知道 fileModificationDate 方法,谢谢 :-)
-
您使用什么硬件进行测试? SSD 的性能将明显优于 iOS 设备中的闪存。也就是说,500 个文件并不多,即使对于嵌入式硬件也是如此。您是否期望该量级在您的缓存范围内?还是您必须将其扩展到数千张图像?
-
@ImHuntingWabbits 这很奇怪,SSD 的运行速度比我的 iPhone 5 慢,但老实说,模拟器并没有真正让我感兴趣,只对实际设备感兴趣。在尝试查询超过 500 个文件时,我使用 sqlite 达到了某种限制,并出现错误“SQLite 错误:复合 SELECT 中的术语太多”,所以我暂时将其保持在 500。
-
您的测试结果似乎没有表明这一点。对于 sqlite 和 ~9ms 文件系统,模拟器是 ~1ms,但上面的设备对于 sqlite 和文件系统看起来像 ~17ms 和 ~130ms。该设备的结果符合我对当前一代硬件的预期,但在当前 iPod touch 和旧 iPhone/iPad 等设备上速度较慢。
-
你完全正确。我将发布的结果与我在非 ssd mac 上所做的其他较慢的结果混淆了。我会用我的硬件更新问题。
标签: ios iphone objective-c sqlite nsfilemanager