2015-06-26 6 views
0

Я использую 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 мини рода таймингами я вижу следующим образом:

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 

Я понимаю, что Анализировать предлагает гораздо больше, чем просто база данных, тем не менее этот запрос занимает 0.292 сек., который кажется возрастом. Для моего приложения я использую эту операцию довольно часто, когда пользователь перемещается по экрану. Результаты были превосходными, а Parse отставание очень заметно. Стоит отметить, что результаты аналогичны на симуляторе. Проблемы с синтаксическим выпуском, когда вы делаете такие вещи, не обнадеживают, но в любом случае мои вопросы в два раза:

1) Пропустили ли я какие-либо корректировки/настройки производительности в Parse? 2) Имеют ли другие люди, которые использовали Parse, аналогичную работу или имеют какие-либо советы?

На данный момент, похоже, мне нужно будет использовать coredata в приложении и написать свои собственные подпрограммы, чтобы подтолкнуть эти данные к облаку Parse, что намного больше, чем я надеялся.

Спасибо за ваше время.

Update 30Jun15

Спасибо за комментарии, в соответствии с этими замечаниями, вот пример производительности делать это так, как Анализировать хочет, чтобы вы это сделать. Как и прежде, производительность по-прежнему оставляет желать лучшего по сравнению с 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, и слишком медленно для моего приложения. Поскольку пользователь перемещается по экрану, графика выводится в результате этого запроса, и я не могу быстро обновить экран, используя синтаксический анализ, в ответ на ввод пользователя. Результаты очень хорошие.

Мой главный вопрос: просто ли это время запроса соответствует чужому опыту? Интересно, есть ли что-то особенное для моего приложения или набора данных? Набор данных невелик (< 200 элементов), объект синтаксического анализа - это просто строки и ints. Я все еще очень хочу использовать Parse для всех других объектов, которые он предоставляет. Возможно, это просто мои ожидания отключены, но, похоже, для основного запроса долгое время.

+0

его не вопрос конца синтаксического анализа, его проблема конца конца. В предупреждении четко указано, что вы должны изменить (долгосрочная задача в основном потоке), другими словами, обновления, которые вы делаете для таблицы или любые изменения интерфейса, должны выполняться в основном потоке, все остальные асинхронные вызовы не должны быть. Выполните запрос в фоновом режиме и обновите результаты в представлении основного потока. – soulshined

+0

Спасибо за ваш комментарий. В самом приложении я выдвигаю все задачи на задний план. Конечно, с точки зрения производительности это делает вещи еще медленнее. Суть моей заботы - время, необходимое для выполнения запроса - согласно моему примеру. В моем приложении экран анимируется по ходу навигации пользователя, анимация оставляет желать лучшего, поскольку результаты запроса занимают слишком много времени. Как пользователь Parse у вас есть информация о времени запроса для локального хранилища данных? В частности, по сравнению с кровью? – pyrrhoofcam

+0

Вы не выполняете запрос в фоновом потоке, как я уже говорил выше. Вместо использования 'findObjects' используйте [findObjectsInBackgroudWithBlock] (https://parse.com/docs/ios/api/Classes/PFQuery.html#//api/name/findObjectsInBackgroundWithBlock :), тогда, когда вы заполняете представление таблицы массивом убедитесь, что вы делаете эту часть основного потока. Много учебников там или даже на SO для этого. – soulshined

ответ

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.

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 предлагает много бесплатно, просто имейте в виду, если вы запросите его много в быстрой последовательности, вы можете увидеть некоторые проблемы с производительностью в зависимости от вашего приложения и ваших потребностей.

Смежные вопросы