Skip to content

Instantly share code, notes, and snippets.

@t3hk0d3
Last active November 14, 2023 03:27
Show Gist options
  • Save t3hk0d3/0c220d54307d179b5ba586ff3e73ce21 to your computer and use it in GitHub Desktop.
Save t3hk0d3/0c220d54307d179b5ba586ff3e73ce21 to your computer and use it in GitHub Desktop.

Oga vs Nokogiri

Benchmark Results

Warming up --------------------------------------
          oga.simple   503.000  i/100ms
           oga.xpath   677.000  i/100ms
             oga.css   783.000  i/100ms
     nokogiri.simple   450.000  i/100ms
      nokogiri.xpath   145.000  i/100ms
        nokogiri.css   210.000  i/100ms
       nokogiri.slop    81.000  i/100ms
Calculating -------------------------------------
          oga.simple     14.479k (± 6.8%) i/s -     72.432k in   5.027306s
           oga.xpath      9.530k (± 4.5%) i/s -     48.067k in   5.053748s
             oga.css      8.629k (± 4.0%) i/s -     43.065k in   4.998643s
     nokogiri.simple     10.771k (± 6.0%) i/s -     54.000k in   5.033027s
      nokogiri.xpath      3.198k (± 6.2%) i/s -     15.950k in   5.007498s
        nokogiri.css      2.933k (± 5.6%) i/s -     14.700k in   5.029852s
       nokogiri.slop    638.924  (±13.3%) i/s -      3.159k in   5.033672s

Comparison:
          oga.simple:    14478.7 i/s
     nokogiri.simple:    10770.5 i/s - 1.34x  slower
           oga.xpath:     9530.4 i/s - 1.52x  slower
             oga.css:     8628.9 i/s - 1.68x  slower
      nokogiri.xpath:     3197.7 i/s - 4.53x  slower
        nokogiri.css:     2932.6 i/s - 4.94x  slower
       nokogiri.slop:      638.9 i/s - 22.66x  slower

Benchmark code

require 'oga'
require 'nokogiri'
require 'benchmark/ips'

xml = <<XML
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rating>
  <kp_rating num_vote="14108">8.375</kp_rating>
</rating>
XML

Benchmark.ips do |x|
  x.config(:time => 5, :warmup => 2)

  x.report('oga.simple') do
    oga_doc = Oga.parse_xml(xml)
    ratings = oga_doc.children.first.children
    kp_rating = ratings.detect { |e| e.name == "kp_rating" }
  end
  
  x.report('oga.xpath') do
    oga_doc = Oga.parse_xml(xml)
    kp_rating = oga_doc.at_xpath('/rating/kp_rating')
  end

  x.report('oga.css') do
    oga_doc = Oga.parse_xml(xml)
    kp_rating = oga_doc.at_css('kp_rating')
  end

  x.report('nokogiri.simple') do
    nokogiri_doc = Nokogiri::XML.parse(xml)
    ratings = nokogiri_doc.children.first.children
    kp_rating = ratings.detect { |e| e.name == "kp_rating" }
  end

  x.report('nokogiri.xpath') do
    nokogiri_doc = Nokogiri::XML.parse(xml)
    kp_rating = nokogiri_doc.at_xpath('/rating/kp_rating')
  end

  x.report('nokogiri.css') do
    nokogiri_doc = Nokogiri::XML.parse(xml)
    kp_rating = nokogiri_doc.at_css('kp_rating')
  end

  x.report('nokogiri.slop') do
    nokogiri_doc = Nokogiri::XML.parse(xml).slop!
    kp_rating = nokogiri_doc.rating.kp_rating
  end

  x.compare!
end
@guycall
Copy link

guycall commented Apr 6, 2018

I re-ran this with: ruby 2.3.6 / oga 2.14 / nokogiri 1.8.2 / VM running Ubuntu 14.04.5 LTS

Warming up --------------------------------------
          oga.simple   657.000  i/100ms
           oga.xpath   612.000  i/100ms
             oga.css   550.000  i/100ms
     nokogiri.simple     2.937k i/100ms
      nokogiri.xpath     1.713k i/100ms
        nokogiri.css     1.496k i/100ms
       nokogiri.slop   777.000  i/100ms
Calculating -------------------------------------
          oga.simple      6.808k (± 7.7%) i/s -     34.164k in   5.050580s
           oga.xpath      6.452k (± 6.9%) i/s -     32.436k in   5.052544s
             oga.css      5.956k (± 6.9%) i/s -     29.700k in   5.010636s
     nokogiri.simple     29.388k (± 9.2%) i/s -    146.850k in   5.044903s
      nokogiri.xpath     17.235k (± 7.3%) i/s -     87.363k in   5.096031s
        nokogiri.css     15.746k (± 7.7%) i/s -     79.288k in   5.066746s
       nokogiri.slop      8.178k (± 7.1%) i/s -     41.181k in   5.063378s

Comparison:
     nokogiri.simple:    29388.0 i/s
      nokogiri.xpath:    17235.4 i/s - 1.71x  slower
        nokogiri.css:    15746.3 i/s - 1.87x  slower
       nokogiri.slop:     8177.6 i/s - 3.59x  slower
          oga.simple:     6808.3 i/s - 4.32x  slower
           oga.xpath:     6451.6 i/s - 4.56x  slower
             oga.css:     5955.9 i/s - 4.93x  slower

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment