производительность сети iPhone - PullRequest
0 голосов
/ 26 июня 2009

У меня есть вопрос, и я очень открыт для предложений (даже очень странных!)

Я пишу приложение для iPhone, которое делает запрос (URL с параметрами) на сервер. В ответ iPhone получает XML. Все хорошо.

Сейчас я стремлюсь улучшить скорость своего приложения, измеряя время, необходимое для выполнения определенных задач. Я обнаружил, что из всех выполненных задач (загрузка, синтаксический анализ XML, отправка запроса, обработка запроса, анализ объектов из XML) загрузка фактического XML занимает больше всего времени.

Теперь мои XML-файлы очень, очень, очень простые и очень, очень, очень маленькие. Я использую их в основном для чтения RSS-подобных данных и отображения их в UITableView.

Мое приложение работает очень хорошо, и нет ничего, что кажется действительно медленным, но сейчас в App Store есть одно приложение, которое делает что-то очень похожее на мое приложение, но работает намного быстрее и чувствует себя более «быстро», если если вы понимаете, о чем я. Он также имеет отличную возможность загружать заголовки по одному из RSS-ленты.

В настоящее время я экспериментирую со сжатием моих данных с помощью gzip, но сжатие только делает мои данные вдвое меньшими, и, похоже, это не очень хорошо сказывается на производительности. Главное, чтобы данные были загружены до того, как они будут проанализированы. Было бы очень здорово иметь «поток» данных, который анализируется по мере поступления. Таким образом, я могу выполнять две работы почти одновременно и загружать заголовки по очереди (делая интерактивность пользователей более привлекательной).

У кого-нибудь есть идеи, как улучшить мою производительность? Либо с помощью великолепных советов по сжатию, либо с помощью совершенно других способов связи с сервером. Все приветствуется!

ОБНОВЛЕНИЕ: отложив время ожидания и скорость отклика сервера; как я могу получить источник XML для потоковой передачи на мой iPhone (загруженный байт за байт) и в то же время быть проанализированным? Прямо сейчас это линейный процесс загрузки -> разбора -> показа, но он может стать полупараллельным при одновременной загрузке и разборе (и показывать каждый элемент после завершения загрузки, вместо того, чтобы загружать все одновременно). время в UITableView)

Ответы [ 4 ]

3 голосов
/ 26 июня 2009

Предполагая, что вы используете initWithContentsOfURL: NSXMLParser, это, вероятно, часть проблемы. Похоже, что он загружает все содержимое URL, а затем передает его анализатору для одновременного анализа.

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

Альтернативой может быть использование NSURLConnection, создание нового NSXMLParser и повторный анализ данных каждый раз, когда поступают некоторые данные, в соединении: didReceiveData: метод вашего делегата NSURLConnection. Вам нужно написать дополнительный код, чтобы игнорировать дополнительные события от повторного анализа начала файла более одного раза.

Похоже, что это будет больше работы, чем просто захват какой-то другой библиотеки и ее адаптация, но, возможно, нет, в зависимости от того, как вы обрабатываете последующее создание ваших табличных данных.

1 голос
/ 26 июня 2009

Если NSMutableArray является базовой структурой данных вашего UITableView, вам следует попробовать используя initWithContentsOfURL. Формат на сервере должен быть в яблочном «плисте» xml, который легко генерировать. Я предполагаю, что если у какао уже есть ресурсы, приобретенные для обрабатывая xml, было бы быстрее использовать их вместо создания собственного экземпляра xml-анализатора.

0 голосов
/ 26 июня 2009

Поскольку ваши xml-файлы очень маленькие (всего 8k или около того, я полагаю?), Я не думаю, что вы увидите значительное повышение производительности при попытке их проанализировать по мере их поступления. сделать это, но я не вижу, чтобы это помогало с маленьким файлом. Рассматривали ли вы время, необходимое для создания файла XML на сервере? Вы используете PHP для создания XML или получаете доступ к статическому файлу? В целях тестирования может быть интересно получить доступ к статическим файлам и посмотреть, как они сравниваются.

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

Кроме того, используйте инструменты для просмотра объема памяти, выделяемой при загрузке и анализе XML-документа. Некоторые анализаторы XML загружают весь XML-документ в память и затем позволяют случайным образом индексировать элементы документа, тогда как другие предоставляют только пошаговый анализ. Пошаговый метод намного лучше для ограниченных устройств, таких как iPhone, и, вероятно, это то, что вы используете, но быстрый взгляд на потребление памяти должен сказать вам.

0 голосов
/ 26 июня 2009

Как вы анализируете данные XML. Необходимость синтаксического анализа XML при его получении - это единственная причина, по которой был изобретен синтаксический анализ, и у них есть анализатор событий NSXMLParser, который работает с потоком данных ...

Это также означает, что сжатие данных контрпродуктивно.

Для очень небольших объемов XML проблема скорости, вероятно, связана с задержкой соединения.

Таким образом, другим важным фактором может быть поиск DNS. Вы можете сделать это самостоятельно один раз и кешировать IP-адрес, возможно, перепроверять только при невозможности подключения к вашему серверу ...

...