mirror of
				https://github.com/fog/fog.git
				synced 2022-11-09 13:51:43 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			69 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
require 'benchmark'
 | 
						|
require 'rubygems'
 | 
						|
require 'nokogiri'
 | 
						|
 | 
						|
class Parser < Nokogiri::XML::SAX::Document
 | 
						|
 | 
						|
  attr_reader :response
 | 
						|
 | 
						|
  def initialize
 | 
						|
    reset
 | 
						|
  end
 | 
						|
 | 
						|
  def reset
 | 
						|
    @item = {}
 | 
						|
    @response = { :items => [] }
 | 
						|
  end
 | 
						|
 | 
						|
  def characters(string)
 | 
						|
    @value ||= ''
 | 
						|
    @value << string.strip
 | 
						|
  end
 | 
						|
 | 
						|
  def start_element(name, attrs = [])
 | 
						|
    @value = nil
 | 
						|
  end
 | 
						|
 | 
						|
  def end_element(name)
 | 
						|
    case name
 | 
						|
    when 'item'
 | 
						|
      @response[:items] << @item
 | 
						|
      @item = {}
 | 
						|
    when 'key'
 | 
						|
      @item[:key] = value
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def value
 | 
						|
    @value.dup
 | 
						|
  end
 | 
						|
 | 
						|
end
 | 
						|
 | 
						|
data = <<-DATA
 | 
						|
<items>
 | 
						|
  <item>
 | 
						|
    <key>value</key>
 | 
						|
  </item>
 | 
						|
</items>
 | 
						|
DATA
 | 
						|
 | 
						|
COUNT = 10_000
 | 
						|
 | 
						|
Benchmark.bmbm(25) do |bench|
 | 
						|
  bench.report('parse') do
 | 
						|
    COUNT.times do
 | 
						|
      parser = Parser.new
 | 
						|
      Nokogiri::XML::SAX::Parser.new(parser).parse(data)
 | 
						|
      parser.response
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  bench.report('push') do
 | 
						|
    COUNT.times do
 | 
						|
      parser = Parser.new
 | 
						|
      Nokogiri::XML::SAX::PushParser.new(parser).write(data, true)
 | 
						|
      parser.response
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |