Melhor desempenho com libxml2 ou NSXMLParser no iPhone?

Estou curioso para saber qual é a sua solução para a análise XML de alto desempenho no iPhone, dada a quantidade limitada de energia da CPU. Eu analisei o XML Performance App que a Apple fornece como uma demonstração, e parece que para o feed de dados (300 músicas do iTunes) que eles estão analisando .. A libxml2 sempre parece vir como vencedora de vanguarda.

Com sua experiência em lidar com dados que são <100Kb, o que você prefere para um desempenho ideal? Atualmente, estou usando o TouchXML + libxml2 e procurando ver se é possível otimizar as velocidades de análise como estão.

Obrigado pelo seu feedback!

Eu geralmente encontrei para maiores pedaços de dados (como o exemplo de maçã que você faz referência) libxml2 tende a ser mais rápido. Para pequenos pedaços de dados, a diferença é insignificante. Uma vantagem que eu gosto sobre o NSXMLParser é que ele é uma implementação baseada em Objective-C de um XML Parser, onde libxml2 é baseada em C.

Você sempre pode dar uma olhada no meu substituto para NSXMLParser. Ele lê os dados XML de um stream, em vez de mantê-los todos na memory, e os passa 1 KB de cada vez para o libxml (onde o NSXMLParser entrega tudo de uma vez).

O código fonte está disponível no github e meu artigo sobre os aspectos da memory estão no meu blog .

A libxml2 sempre será mais rápida que o NSXMLParser por vários motivos, no entanto, depende de você que é mais útil para o seu projeto.

O NSXMLParser, no geral, é mais bonito. O código faz sentido, como supostamente é o sax parser, e é uma verdadeira aula de cacau com todas as convenções lá. Se conveniência e código limpo são suas principais prioridades, então você deve ficar com o NSXMLParser.

Enquanto o NSXMLParser usa o libxml2 no backend, ele é mais lento devido aos fundamentos do Objective-C e do calcanhar de Aquiles do Objective-C. Ao analisar XML, você está basicamente fazendo vários loops apertados várias vezes enquanto procura as tags nas quais está interessado.

Aqui está a lição – quando em um loop apertado no Objective C que você não consegue utilizar a Enumeração Fast Object, você está olhando para um sério impacto no desempenho. Dispatch / Delegate respondsToSelector / e outras construções de linguagem base do Objective C oferecem uma desvantagem real aqui.

Eu não vou entrar em despacho, mas o ponto crucial é, sempre que você acessa algo como: “[zomg lolz]” você está entregando uma assinatura de método para o dispatcher objective-c para encontrar a function C de destino para sua assinatura do método Objective-C. Esse processo de consulta, quando feito repetidamente, pode reduzir drasticamente seu desempenho.

Se você estiver em um iPhone, vá para libxml2 e não olhe para trás – mas se sua máquina de destino tiver dois processadores e mais ram que god, eu usarei o NSXMLParser para facilitar a manutenção de código.

Eu tentei meus dados (cerca de 600 registros) usando o XML parsing app maçã fornece. Encontrou o libxml2 para ser muito mais rápido que o NSXMLParser. Eu mudei para libxml2 (embora eu ache que é um pouco mais complexo de implementar do que o NSXMLParser, ele se adequou bem ao meu propósito)

O mesmo exemplo tentado com cerca de 100 registros não tem muita diferença em ambas as implementações.

A libxml2 sempre será mais rápida que o NSXMLParser. O NSXMLParser oferece a você uma API decente para events, mas ele é construído sobre o libxml2 e também não é baseado em stream (por exemplo, o NSXMLParser entrega todo o bloco de dados ao libxml2 de uma só vez).

Se você está otimizando a velocidade, libxml2 é definitivamente o caminho a percorrer. No entanto, se você quiser uma API baseada em events obj-c e não se importar tanto com o desempenho, o NSXMLParser é a ferramenta certa para o trabalho. E observe que o NSXMLParser não é necessariamente lento, não é tão rápido quanto a libxml2.

Se você quiser usar libxml2 com uma frente Objective-C, dê uma olhada neste útil conjunto de funções wrapper .

Você emite uma consulta Xpath para seu object de documento XML e recebe objects de class Foundation: NSArray , NSString e NSDictionary .

Essas funções ajudam a unir a velocidade da libxml2 com a legibilidade do código Objective-C.

A libxml2 é mais rápida que o NSXMLParser, além de mais flexível. Ele também tem um memory leaks muito pequeno (mas perceptível) com a interface xmlReader (minha interface favorita do conjunto) no SDK lançado com o iPhone OS 2.2.1. Detalhes incorporados em http://inessential.com/2009/02/25/moving_to_libxml2_sax2 . Outras interfaces dentro da libxml2 não têm esse problema – o mesmo acontece com o meu favorito.

Funcionalmente, você não notará a diferença com quantidades relativamente pequenas de XML, mas se você se deparar com um grande conjunto transmitido para o analisador, ele ficará perceptível.

Como zPesk mencionou, para quantidades menores de dados você pode achar que o benefício de trabalhar diretamente com o Objective-C é mais benéfico do que a pequena quantidade de desempenho que você obtém.

Eu usei o Objective-Xml. Esta é outra queda no substituto do NSXMLParser. Isso me deu uma melhoria de 15 segundos em um arquivo que estava levando mais de 1 minuto para analisar. Ainda muito lento embora.