Faster RESTful XML processing in Rails
The Floorplanner API uses XML-formatted requests and responses, so our servers process a lot of XML. In Rails, most XML parsing is done using the Hash.from_xml method. This method allows for different backends, but the current backends are either slow or buggy. I decided to fix this situation myself.
I fixed bugs in the current libxml and nokogiri backends, and I added some new SAX-based backends for additional performance. My patches are already accepted by the Rails team, so everybody will enjoy fast and bug-free XML parsing in Rails 2.3.6 and eventually in Rails 3!
Performance
I have benchmarked the new backends using an 1.8 MB XML file. The REXML, LibXML and Nokogiri backends currently ship with Rails, but are horribly slow or are buggy. The ++ variants are my improved versions of these backends, and the SAX variants are completely written from scratch using a SAX-based parser.
user system total real
REXML 17.170000 0.060000 17.230000 ( 17.297263)
LibXML 2.100000 0.100000 2.200000 ( 2.217380)
LibXML++ 0.530000 0.000000 0.530000 ( 0.531034)
LibXMLSAX 0.630000 0.010000 0.640000 ( 0.632472)
Nokogiri 5.280000 0.020000 5.300000 ( 5.322575)
Nokogiri++ 1.840000 0.020000 1.860000 ( 1.872055)
NokogiriSAX 0.770000 0.000000 0.770000 ( 0.778777)
As you can see, LibXML++ is the fastest backend, but NokogiriSAX comes close if you want to stick to Nokogiri.
No patience?
Don’t want to wait for the next Rails version for this speed up? You don’t have to: just put the appropriate backend file in the /lib/active_support/xml_mini/ folder of your Rails project, and set your backend accordingly in your environment:
ActiveSupport::XmlMini.backend = 'NokogiriSAX'
Happy coding in 2010!






January 4th, 2010 at 3:18 am
The fastest XML processing comes from VTD-XML …
January 4th, 2010 at 3:18 am
vtd-xml, not nokogiri, has the fastest XML performance
January 4th, 2010 at 10:54 am
Unfortunately, no Ruby bindings exists for VTD-XML yet. Moreover, because the library is GPL licensed, you’ll need to release your application under the GPL if you release it.