diff --git a/benchs/parse_vs_push.rb b/benchs/parse_vs_push.rb new file mode 100644 index 000000000..eebfbd33f --- /dev/null +++ b/benchs/parse_vs_push.rb @@ -0,0 +1,60 @@ +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 << string.strip + end + + def start_element(name, attrs = []) + @value = '' + end + + def end_element(name) + case name + when 'item' + @response[:items] << @item + @item = {} + when 'key' + @item[:key] = @value + end + end + +end + +data = <<-DATA + + + value + + +DATA + +COUNT = 100 + +Benchmark.bmbm(25) do |bench| + bench.report('parse') do + parser = Parser.new + Nokogiri::XML::SAX::Parser.new(parser).parse(data) + parser.response + end + + bench.report('push') do + parser = Parser.new + Nokogiri::XML::SAX::PushParser.new(parser).write(data, true) + parser.response + end +end diff --git a/lib/fog/aws/ec2.rb b/lib/fog/aws/ec2.rb index c8d30328c..bde5db8d6 100644 --- a/lib/fog/aws/ec2.rb +++ b/lib/fog/aws/ec2.rb @@ -391,7 +391,7 @@ module Fog }) if parser && !response.body.empty? - Nokogiri::XML::SAX::Parser.new(parser).parse(response.body) + Nokogiri::XML::SAX::PushParser.new(parser).write(response.body, true) response.body = parser.response end diff --git a/lib/fog/aws/s3.rb b/lib/fog/aws/s3.rb index a6008f59f..6ce3f0465 100644 --- a/lib/fog/aws/s3.rb +++ b/lib/fog/aws/s3.rb @@ -300,7 +300,7 @@ DATA }) if params[:parser] && !response.body.empty? - Nokogiri::XML::SAX::Parser.new(params[:parser]).parse(response.body) + Nokogiri::XML::SAX::PushParser.new(params[:parser]).write(response.body, true) response.body = params[:parser].response end diff --git a/lib/fog/aws/simpledb.rb b/lib/fog/aws/simpledb.rb index 981f8a58c..79004f46f 100644 --- a/lib/fog/aws/simpledb.rb +++ b/lib/fog/aws/simpledb.rb @@ -333,7 +333,7 @@ module Fog }) if parser && !response.body.empty? - Nokogiri::XML::SAX::Parser.new(parser).parse(response.body) + Nokogiri::XML::SAX::PushParser.new(parser).write(response.body, true) response.body = parser.response end