在我們的一個應用程序中,我被要求記錄圖像的最後修改日期。這樣我可以檢查服務器,如果某個圖像已更改並相應地更新我的緩存。訪問文件屬性vs訪問sqlite記錄
我的第一種方法是訪問文件屬性並進行比較,但在線上的一些地方提到了延遲方面的嚴重瓶頸。
我的第二選擇是創建一個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方法,謝謝:-) –
你用什麼硬件進行測試?在iOS設備中,SSD的性能將明顯優於閃存。這就是說500並不是那麼多文件,即使是嵌入式硬件。你預計這個數量是否在你的緩存範圍之內?或者你將不得不擴大到成千上萬的圖像? – ImHuntingWabbits
@ImHuntingWabbits這很奇怪,SSD的執行速度比我的iPhone 5慢,但說實話,模擬器並不真的讓我感興趣,只有實際的設備。當試圖查詢超過500個文件時,我用sqlite得到了一些限制,出現「SQLite錯誤:複合SELECT中的條目過多」,所以我現在要保留500個。 – Segev