Nokogiri :: XML :: Builder оказывается медленнее, чем Builder для генерации XML в Rails? - PullRequest
2 голосов
/ 01 ноября 2011

Мы использовали Rails '(2.3.3) Builder для создания разметки XML для наших API некоторое время, когда мы думали, что Builder от Nokogiri будет генерировать XML быстрее (как отмечали многие).

Проблема в том, что мои тесты показали, что Nokogiri :: Builder медленнее, чем обычный Builder:

Nokogiri::Builder: 3.1314s
Builder:           2.1592s

для рендеринга точно такого же запроса в 10 раз.Я неоднократно повторял аналогичные тесты в разных средах, поэтому я уверен, что Nokogiri работает медленнее.

Наше приложение имеет множество представлений .xml.builder, которые используют много партиций .xml.builder:

xml.instruct!
xml.feed do
  xml.stuff do
    xml.more_stuff(...)
  end
  xml.location do
    xml << render(:partial => shared/location, :object => mylocation)
  end
end

Выше используется общий / _location.xml.builder.Наше приложение интенсивно использует такие XML-партиалы для организации кода.

Я перешел на Nokogiri после « Ускорьте ваши Rails XML-ответы » (см. Тестовое приложение там).Обработчик шаблона выглядит следующим образом:

class NokogiriBuilder < ActionView::TemplateHandler
  include ActionView::TemplateHandlers::Compilable

  def compile template
    "_set_controller_content_type(Mime::XML);" +
      "xml = ::Nokogiri::XML::Builder.new(:encoding => 'UTF-8') { |xml| " +
      template.source +
      '}.to_xml; self.output_buffer = xml;'
  end 
end

Когда я пытался запустить свой код через rubyprof, результаты показывают, что create_element занимает много времени!

 %self     total     self     wait    child    calls  name
 23.47      1.15     1.15     0.00     0.00      731  Mysql#query
  9.59      0.78     0.47     0.00     0.31     1437  Nokogiri::XML::Document#create_element
  7.96      3.61     0.39     0.00     3.61      867  <Module::Benchmark>#realtime
  5.51      0.27     0.27     0.00     0.00     1167  Nokogiri::XML::Node#encode_special_chars
  5.51      0.28     0.27     0.00     0.01     1370  Module#define_method
  5.10      0.26     0.25     0.00     0.01      346  Array#select
  3.88      0.19     0.19     0.00     0.00     5236  Module#constants
  3.27      0.90     0.16     0.00     0.83     1820  Array#collect
  2.45      0.13     0.12     0.00     0.01     1712  Rack::Lint::Assertion#assert
  2.24      1.09     0.11     0.00     1.09      554  ActiveSupport::CoreExtensions::String::Inflections#constantize
  2.04      0.10     0.10     0.00     0.00       23  Nokogiri::XML::ParseOptions#initialize
  2.04      0.10     0.10     0.00     0.00      726  <Class::ActiveSupport::Callbacks::CallbackChain>#extract_options

Я действительноИнтересно, что же такого особенного в моем случае, что Нокогири будет медленнее, хотя для многих он оказался во много раз быстрее!

Нет нежных занятий любовью?: - (

...