我使用parse作为云存储,并结合本地数据存储进行一般访问。我发现查询本地数据存储需要的时间比我预期的要长很多。使用数据填充表或更新图形视图时,这一点尤其明显。 coredata中的等效函数几乎是瞬时的,结果非常好。虽然我不期望coredata的性能,但它比我预期的离线访问慢得多,我想知道我做错了什么?
以下是一个示例查询:
PFQuery *query = [PFQuery queryWithClassName:LOCATION_OBJECT];
[query fromLocalDatastore];
[query whereKey:MESSAGE_TO_FIELD equalTo:user.username];
[query orderByDescending:CREATED_FIELD];
NSLog(@"Query started");
NSArray* res = [query findObjects];
NSLog(@"Query finished, found %lu objects", (unsigned long)[res count]);
在2015 iPad mini上执行我看到的时间顺序如下:
2015-06-16 18:56:38.883 app[1744:1668474] Query started
2015-06-16 18:56:38.885 app[1744:1668474] Warning: A long-running operation is being executed on the main thread.
Break on warnBlockingOperationOnMainThread() to debug.
2015-06-16 18:56:39.177 app[1744:1668474] Query finished, found 17 objects
我确实理解Parse提供的不仅仅是数据库,不过这个查询需要0.292秒,这似乎是一个时代。对于我的应用程序,当用户在屏幕上导航时,我会经常使用这种操作。使用coredata,结果非常好,Parse的延迟非常明显。值得一提的是,模拟器上的结果相似。当你做这类事情时警告解析问题并不令人鼓舞,但无论如何,我的问题有两个:
1)我是否错过了Parse中的任何性能调整/设置? 2)是否有其他使用过Parse的人发现了类似的表现或有任何建议?
此时,看起来我需要在应用程序中使用coredata并编写我自己的例程来将数据推送到Parse的云中,这比我希望的工作要多得多。
感谢您的时间。
更新30Jun15
感谢您的评论,根据这些评论,以下是Parse希望您这样做的示例表现。和以前一样,与coredata相比,性能仍然很差。示例代码:
PFQuery *query = [PFQuery queryWithClassName:LOCATION_OBJECT];
[query fromLocalDatastore];
[query whereKey:MESSAGE_TO_FIELD equalTo:user.username];
[query orderByDescending:CREATED_FIELD];
NSLog(@"Query started ... ");
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
NSLog(@"Query finished ... ");
if(!error)
NSLog(@"Found %lu message records in local datastore", (unsigned long)[objects count]);
else
NSLog(@"Parse error pulling messages from datastore: %@ %@", error, [error userInfo]);
}];
在同一台iPad上的表现:
2015-06-30 10:32:09.633 MvBii[205:5172] Query started ...
2015-06-30 10:32:09.948 MvBii[205:5172] Query finished ...
2015-06-30 10:32:09.948 MvBii[205:5172] Found 100 message records in local datastore
查询需要0.315秒。现在,和以前一样,我并不是说这本身就很糟糕,可能对于很多应用来说它很好,但它比coredata差几个数量级,对我的应用来说太慢了。当用户在屏幕周围导航时,由于该查询而绘制图形,并且我无法使用解析来更快地更新屏幕以响应用户输入。使用coredata,结果非常好。
我的主要问题是这个查询时间是否符合其他任何人的经验?我想知道我的应用程序或数据集是否有什么特别之处?数据集不大(<200项),解析对象只是字符串和整数。我仍然真的想要将Parse用于它提供的所有其他设施。也许这只是我的期望已关闭,但基本查询似乎需要很长时间。
答案 0 :(得分:6)
Parse现在是开源的,所以我对此进行了进一步研究。以下是我的发现。
Parse构建按顺序执行的任务队列,按请求顺序执行。这与请求的方式无关(前景,背景或带回调的背景)。任务从队列中拉出以进行处理,实质上需要大约几百毫秒来完成任务,为任务创建线程然后执行所述任务。请注意,列表中的下一个任务在前一个任务完成之前不会被处理。因此,如果您要快速解析许多任务,则任务会排队,您将看到时间与任务数量呈线性增长。这是一些实验性代码:
PFQuery* query = [PFQuery queryWithClassName:ANNOTATION_OBJECT];
[query fromLocalDatastore];
[query orderByAscending:CREATED_FIELD];
NSLog(@"Query 1 started");
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error)
NSLog(@"Query 1 finished");
}];
query = [PFQuery queryWithClassName:ANNOTATION_OBJECT];
[query fromLocalDatastore];
[query orderByAscending:CREATED_FIELD];
NSLog(@"Query 2 started");
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error)
NSLog(@"Query 2 finished");
}];
query = [PFQuery queryWithClassName:ANNOTATION_OBJECT];
[query fromLocalDatastore];
[query orderByAscending:CREATED_FIELD];
NSLog(@"Query 3 started");
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (!error)
NSLog(@"Query 3 finished");
}];
因此推送3个查询以快速连续解析。它们排队等待,因此查询3的完成时间是查询1的3倍。
2015-09-23 14:29:28.419 MvBii[257:59781] Query 1 started
2015-09-23 14:29:28.420 MvBii[257:59781] Query 2 started
2015-09-23 14:29:28.421 MvBii[257:59781] Query 3 started
2015-09-23 14:29:28.658 MvBii[257:59781] Query 1 finished
2015-09-23 14:29:28.854 MvBii[257:59781] Query 2 finished
2015-09-23 14:29:29.011 MvBii[257:59781] Query 3 finished
对于我的应用程序,几百毫秒的查询时间几乎没问题,但是当用户导航时,请求会叠加,这意味着队列末尾的请求需要很长时间。这不是解析的不合理,但应该意识到这就是它的行为方式。如果在此任务的中间存在引脚或保存,则查询将延迟引脚或保存所花费的时间。这可能是几秒钟。
Parse免费提供很多功能,请注意,如果您快速连续请求很多,您可能会看到一些性能问题,具体取决于您的应用和您的需求。