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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • iPhone: обнаружение бездействия пользователя / время простоя с момента последнего касания экрана
  • UITextView с подсветкой синтаксиса
  • Ошибка сборки Xcode «Неопределенные символы для архитектуры x86_64»
  • Получить нажатие кнопки внутри UITableViewCell
  • NSTimeZone: в чем разница между localTimeZone и systemTimeZone?
  • UIWebView - Как определить последнее сообщение webViewDidFinishLoad?
  • Проблема автосохранения кадра UICollectionViewCell contentView в ячейке прототипа Storyboard (Xcode 6, iOS 8 SDK) происходит при запуске только на iOS 7
  • Округлые углы на UIImage
  • Собственное использование приложения делегата приложения iPhone
  • Создайте случайную буквенно-цифровую строку в Cocoa
  • Как получить размер NSString
  • Interesting Posts

    Переадресация с помощью Event Listener для всех «Не найден маршрут 404 Not Found – NotFoundHttpException»

    Android – получить значение от HashMap

    Как создать задачу (TPL), использующую stream STA?

    Когда, если когда-либо, цикл разворачивания по-прежнему полезен?

    Как сгенерировать все пары из двух векторов в MATLAB с помощью векторизованного кода?

    Вызвать метод активности из fragmentа

    Android – TimePicker минут до 15

    Есть ли способ узнать, какое приложение использует большую часть моей пропускной способности в окнах

    Форвардное объявление вложенных типов / classов в C ++

    Как установить Защитник Windows / MSE на Server 2012?

    Присоединение к одному пользователю

    Почему пример не компилируется, а как работает (co-, contra- и in) дисперсия?

    Ioc / DI – Почему мне нужно ссылаться на все слои / сборки в приложении ввода?

    FileSystemWatcher Не удается получить доступ к сетевому диску

    Как удалить акценты в строке?

    Давайте будем гением компьютера.