Лучшая производительность с помощью libxml2 или NSXMLParser на iPhone?

Мне любопытно, что ваше решение для высокопроизводительного анализа XML на iPhone, учитывая ограниченное количество процессорных мощностей. Я рассмотрел приложение производительности XML, которое Apple предоставляет в качестве демонстрации, и кажется, что для фида данных (300 песен iTunes), которые они разборки.. libxml2 всегда кажется победителем.

С вашим опытом работы с данными, 100Kb, что вы предпочитаете для оптимальной работы? В настоящее время я использую TouchXML + libxml2 и смотрю, можно ли оптимизировать скорость разбора, как есть.

Спасибо за отзыв!

Ответ 1

Я обычно нашел для больших фрагментов данных (например, пример с яблоком, который вы ссылаетесь) libxml2 имеет тенденцию быть быстрее. Для меньших фрагментов данных разница незначительна. Одно из преимуществ, которое мне нравится в NSXMLParser, заключается в том, что это реализация на основе Objective-C XML-парсера, где libxml2 - на основе C.

Ответ 2

Вы всегда можете взглянуть на мою замену на NSXMLParser. Он читает XML-данные из потока, а не сохраняет все в памяти, и передает его 1 Кбайт за раз в libxml (где NSXMLParser передает все за один раз).

Исходный код доступен в github, и моя запись по аспектам памяти на моем блог.

Ответ 3

libxml2 всегда будет быстрее, чем NSXMLParser по многим причинам, однако, это зависит от вас, что более полезно для вашего проекта.

NSXMLParser, в целом, красивее. Код имеет смысл, поскольку саксовый парсер должен быть, и это настоящий класс Cocoa со всеми соглашениями. Если удобство и чистый код являются вашими первоочередными приоритетами, вы должны придерживаться NSXMLParser.

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

В этом заключается урок - когда в узком цикле Objective C вы не можете использовать Fast Object Enumeration, вы смотрите на серьезный удар производительности. Отправка/Делегирование отвечает наТелектор/и другие конструкторы базового языка Objective C, что дает вам настоящий недостаток.

Я не собираюсь входить в рассылку, но суть в том, что когда вы обращаетесь к чему-то вроде этого: "[zomg lolz]" вы передаете подпись метода диспетчеру Objective-C, чтобы найти цель C -функция для вашей подписи Objective-C. Этот процесс поиска, когда он выполняется снова и снова, может значительно снизить производительность.

Если вы на iPhone, перейдите libxml2 и не оглядывайтесь назад - но если ваша целевая машина имеет два процессора и больше, чем бог, я бы пошел NSXMLParser для упрощения ведения кода.

Ответ 4

Я попробовал свои данные (около 600 записей) с помощью приложения Apple для анализа синтаксического анализа. Нашел libxml2 намного быстрее, чем NSXMLParser. Я перешел на libxml2 (хотя я считаю его более сложным для реализации, чем NSXMLParser, он хорошо подходит для моей цели)

В том же примере, который пробовал около 100 записей, не имеет большой разницы в обеих реализациях.

Ответ 5

libxml2 всегда будет быстрее, чем NSXMLParser. NSXMLParser дает вам достойный API-интерфейс event-bsaed, но он построен поверх libxml2, а также не основан на потоках (например, NSXMLParser передает весь блок данных в libxml2 сразу).

Если вы оптимизируете скорость, libxml2, безусловно, путь. Однако, если вы хотите использовать API-интерфейс, основанный на объектах, и не заботитесь о производительности, NSXMLParser является правильным инструментом для работы. И обратите внимание, что NSXMLParser не обязательно медленный, это не так быстро, как libxml2.

Ответ 6

Если вы хотите использовать libxml2 с фронтом Objective-C, посмотрите на этот полезный набор функции обертки.

Вы отправляете запрос Xpath в объект документа XML и возвращаете объекты класса Foundation: NSArray, NSString и NSDictionary.

Эти функции помогают объединить скорость libxml2 с читабельностью кода Objective-C.

Ответ 7

libxml2 быстрее, чем NSXMLParser, а также более гибкий. Он также имеет очень небольшую (но заметную) утечку памяти с интерфейсом xmlReader (мой любимый интерфейс набора) в SDK, выпущенном с iPhone OS 2.2.1. Детали, встроенные в http://inessential.com/2009/02/25/moving_to_libxml2_sax2. Другие интерфейсы в libxml2 не имеют этой проблемы - просто так происходит мой любимый.

Функционально, вы не заметите разницу с относительно небольшим количеством XML, но если вы обнаружите, что пробираетесь через большой набор, переданный в парсер, он станет заметным.

Как упоминалось zPesk, для меньших объемов данных вы можете найти преимущество работы с Objective-C более выгодным, чем небольшое количество производительности, которое вы получаете.

Ответ 8

Я использовал Objective-Xml. Это еще одна замена для NSXMLParser. Это дало мне о 15-секундном улучшении файла, который занимал 1 минуту, чтобы разобрать. Все еще слишком медленный.