oj 2.9.8 → 2.9.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of oj might be problematic. Click here for more details.
- data/README.md +20 -1
- data/ext/oj/compat.c +2 -0
- data/ext/oj/dump.c +1 -1
- data/ext/oj/object.c +3 -2
- data/ext/oj/oj.c +8 -1
- data/ext/oj/oj.h +3 -0
- data/ext/oj/parse.c +2 -7
- data/ext/oj/parse.h +1 -1
- data/ext/oj/reader.c +17 -24
- data/ext/oj/saj.c +8 -28
- data/ext/oj/scp.c +27 -106
- data/ext/oj/sparse.c +0 -2
- data/ext/oj/strict.c +2 -0
- data/lib/oj/version.rb +1 -1
- data/test/bug.rb +50 -39
- data/test/perf1.rb +64 -0
- data/test/perf2.rb +76 -0
- data/test/perf_obj_old.rb +213 -0
- data/test/test_object.rb +10 -0
- data/test/test_scp.rb +22 -0
- data/test/test_various.rb +1 -1
- metadata +104 -87
- checksums.yaml +0 -7
- data/test/io.rb +0 -48
- data/test/struct.rb +0 -29
- data/test/zip.rb +0 -34
    
        data/ext/oj/sparse.c
    CHANGED
    
    
    
        data/ext/oj/strict.c
    CHANGED
    
    | @@ -149,6 +149,7 @@ oj_strict_parse(int argc, VALUE *argv, VALUE self) { | |
| 149 149 | 
             
                struct _ParseInfo	pi;
         | 
| 150 150 |  | 
| 151 151 | 
             
                pi.options = oj_default_options;
         | 
| 152 | 
            +
                pi.handler = Qnil;
         | 
| 152 153 | 
             
                oj_set_strict_callbacks(&pi);
         | 
| 153 154 |  | 
| 154 155 | 
             
                if (T_STRING == rb_type(*argv)) {
         | 
| @@ -163,6 +164,7 @@ oj_strict_parse_cstr(int argc, VALUE *argv, char *json, size_t len) { | |
| 163 164 | 
             
                struct _ParseInfo	pi;
         | 
| 164 165 |  | 
| 165 166 | 
             
                pi.options = oj_default_options;
         | 
| 167 | 
            +
                pi.handler = Qnil;
         | 
| 166 168 | 
             
                oj_set_strict_callbacks(&pi);
         | 
| 167 169 |  | 
| 168 170 | 
             
                return oj_pi_parse(argc, argv, &pi, json, len, 1);
         | 
    
        data/lib/oj/version.rb
    CHANGED
    
    
    
        data/test/bug.rb
    CHANGED
    
    | @@ -1,5 +1,3 @@ | |
| 1 | 
            -
            #!/usr/bin/env ruby
         | 
| 2 | 
            -
             | 
| 3 1 | 
             
            #!/usr/bin/env ruby
         | 
| 4 2 | 
             
            # encoding: UTF-8
         | 
| 5 3 |  | 
| @@ -7,47 +5,60 @@ $: << File.dirname(__FILE__) | |
| 7 5 |  | 
| 8 6 | 
             
            require 'helper'
         | 
| 9 7 |  | 
| 10 | 
            -
             | 
| 11 | 
            -
             | 
| 12 | 
            -
                @state = []
         | 
| 13 | 
            -
              end
         | 
| 14 | 
            -
             | 
| 15 | 
            -
              def hash_start
         | 
| 16 | 
            -
                @state << {}
         | 
| 17 | 
            -
                @state.last
         | 
| 18 | 
            -
              end
         | 
| 19 | 
            -
             | 
| 20 | 
            -
              def hash_end
         | 
| 21 | 
            -
                @state.pop
         | 
| 22 | 
            -
              end
         | 
| 23 | 
            -
             | 
| 24 | 
            -
              def hash_set(h,k,v)
         | 
| 25 | 
            -
                h.store(k,v)
         | 
| 26 | 
            -
              end
         | 
| 8 | 
            +
            require 'oj'
         | 
| 9 | 
            +
            require 'securerandom'
         | 
| 27 10 |  | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 11 | 
            +
            class Handler
         | 
| 12 | 
            +
              def hash_start()      {} end
         | 
| 13 | 
            +
              def hash_set(h,k,v)   h.store(k,v) end
         | 
| 14 | 
            +
              def array_start()     [] end
         | 
| 15 | 
            +
              def array_append(a,v) a << v end
         | 
| 16 | 
            +
              def error(message, line, column)
         | 
| 17 | 
            +
                raise Exception.new(message, line, column)
         | 
| 31 18 | 
             
              end
         | 
| 19 | 
            +
            end
         | 
| 32 20 |  | 
| 21 | 
            +
            json = Oj.dump({"this"=>"object"})
         | 
| 33 22 |  | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 23 | 
            +
            if true
         | 
| 24 | 
            +
              name = "/tmp/#{SecureRandom.uuid}"
         | 
| 25 | 
            +
              `mkfifo #{name}`
         | 
| 26 | 
            +
              if fork
         | 
| 27 | 
            +
                open(name, 'r+') do |read_io|
         | 
| 28 | 
            +
                  p "start reading #{read_io.stat.ftype}"
         | 
| 29 | 
            +
                  Oj.sc_parse(Handler.new, read_io) {|v| p v}
         | 
| 30 | 
            +
                  p "stop reading"
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
              else
         | 
| 33 | 
            +
                open(name, 'w+') do |write_io|
         | 
| 34 | 
            +
                  p "start writing #{write_io.stat.ftype}  autoclose: #{write_io.autoclose?}"
         | 
| 35 | 
            +
                  write_io.write json
         | 
| 36 | 
            +
                  write_io.write json
         | 
| 37 | 
            +
                  p "stop writing"
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
                sleep(1) # make it obvious that there are two threads
         | 
| 40 | 
            +
                open(name, 'w+') do |write_io|
         | 
| 41 | 
            +
                  p "start writing #{write_io.stat.ftype}"
         | 
| 42 | 
            +
                  write_io.write json
         | 
| 43 | 
            +
                  write_io.write json
         | 
| 44 | 
            +
                  p "stop writing"
         | 
| 45 | 
            +
                end
         | 
| 36 46 | 
             
              end
         | 
| 37 | 
            -
             | 
| 38 | 
            -
               | 
| 39 | 
            -
                 | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 47 | 
            +
            else
         | 
| 48 | 
            +
              IO.pipe do |read_io, write_io|
         | 
| 49 | 
            +
                if fork
         | 
| 50 | 
            +
                  write_io.close
         | 
| 51 | 
            +
                  p "start reading #{read_io.stat.ftype}"
         | 
| 52 | 
            +
                  Oj.sc_parse(Handler.new, read_io) {|v| p v}
         | 
| 53 | 
            +
                  p "stop reading"
         | 
| 54 | 
            +
                  read_io.close
         | 
| 55 | 
            +
                else
         | 
| 56 | 
            +
                  read_io.close
         | 
| 57 | 
            +
                  p "start writing #{write_io.stat.ftype}"
         | 
| 58 | 
            +
                  write_io.write json
         | 
| 59 | 
            +
                  write_io.write json
         | 
| 60 | 
            +
                  p "stop writing"
         | 
| 61 | 
            +
                  write_io.close
         | 
| 62 | 
            +
                end
         | 
| 44 63 | 
             
              end
         | 
| 45 | 
            -
             | 
| 46 | 
            -
              def error(message, line, column); p "ERROR: #{message}" end
         | 
| 47 | 
            -
            end
         | 
| 48 | 
            -
             | 
| 49 | 
            -
            $handler = Handler.new
         | 
| 50 | 
            -
             | 
| 51 | 
            -
            File.open('tst', 'r') do |file|
         | 
| 52 | 
            -
              Oj.sc_parse($handler, file)
         | 
| 53 64 | 
             
            end
         | 
    
        data/test/perf1.rb
    ADDED
    
    | @@ -0,0 +1,64 @@ | |
| 1 | 
            +
            #!/usr/bin/env ruby -wW1
         | 
| 2 | 
            +
            # encoding: UTF-8
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            $: << File.join(File.dirname(__FILE__), "../lib")
         | 
| 5 | 
            +
            $: << File.join(File.dirname(__FILE__), "../ext")
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            #require 'test/unit'
         | 
| 8 | 
            +
            require 'optparse'
         | 
| 9 | 
            +
            require 'oj'
         | 
| 10 | 
            +
            require 'ox'
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            $indent = 2
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            opts = OptionParser.new
         | 
| 15 | 
            +
            opts.on("-h", "--help", "Show this display")                { puts opts; Process.exit!(0) }
         | 
| 16 | 
            +
            files = opts.parse(ARGV)
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            iter = 100000
         | 
| 19 | 
            +
            s = %{
         | 
| 20 | 
            +
            { "class": "Foo::Bar",
         | 
| 21 | 
            +
              "attr1": [ true, [false, [12345, null], 3.967, ["something", false], null]],
         | 
| 22 | 
            +
              "attr2": { "one": 1 }
         | 
| 23 | 
            +
            }
         | 
| 24 | 
            +
            }
         | 
| 25 | 
            +
            #s = File.read('sample.json')
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            Oj.default_options = { :indent => 0 }
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            obj = Oj.load(s)
         | 
| 30 | 
            +
            xml = Ox.dump(obj, :indent => 0)
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            puts xml
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            start = Time.now
         | 
| 35 | 
            +
            iter.times do
         | 
| 36 | 
            +
              Oj.load(s)
         | 
| 37 | 
            +
            end
         | 
| 38 | 
            +
            dt = Time.now - start
         | 
| 39 | 
            +
            puts "%d Oj.load()s in %0.3f seconds or %0.1f loads/msec" % [iter, dt, iter/dt/1000.0]
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            start = Time.now
         | 
| 42 | 
            +
            iter.times do
         | 
| 43 | 
            +
              Ox.load(xml)
         | 
| 44 | 
            +
            end
         | 
| 45 | 
            +
            dt = Time.now - start
         | 
| 46 | 
            +
            puts "%d Ox.load()s in %0.3f seconds or %0.1f loads/msec" % [iter, dt, iter/dt/1000.0]
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            puts
         | 
| 49 | 
            +
             | 
| 50 | 
            +
            start = Time.now
         | 
| 51 | 
            +
            iter.times do
         | 
| 52 | 
            +
              Oj.dump(obj)
         | 
| 53 | 
            +
            end
         | 
| 54 | 
            +
            dt = Time.now - start
         | 
| 55 | 
            +
            puts "%d Oj.dump()s in %0.3f seconds or %0.1f dumps/msec" % [iter, dt, iter/dt/1000.0]
         | 
| 56 | 
            +
             | 
| 57 | 
            +
            start = Time.now
         | 
| 58 | 
            +
            iter.times do
         | 
| 59 | 
            +
              Ox.dump(obj)
         | 
| 60 | 
            +
            end
         | 
| 61 | 
            +
            dt = Time.now - start
         | 
| 62 | 
            +
            puts "%d Ox.dump()s in %0.3f seconds or %0.1f dumps/msec" % [iter, dt, iter/dt/1000.0]
         | 
| 63 | 
            +
             | 
| 64 | 
            +
            puts
         | 
    
        data/test/perf2.rb
    ADDED
    
    | @@ -0,0 +1,76 @@ | |
| 1 | 
            +
            #!/usr/bin/env ruby -wW1
         | 
| 2 | 
            +
            # encoding: UTF-8
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            $: << File.join(File.dirname(__FILE__), "../lib")
         | 
| 5 | 
            +
            $: << File.join(File.dirname(__FILE__), "../ext")
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            #require 'test/unit'
         | 
| 8 | 
            +
            require 'optparse'
         | 
| 9 | 
            +
            require 'yajl'
         | 
| 10 | 
            +
            require 'oj'
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            $indent = 2
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            opts = OptionParser.new
         | 
| 15 | 
            +
            opts.on("-h", "--help", "Show this display")                { puts opts; Process.exit!(0) }
         | 
| 16 | 
            +
            files = opts.parse(ARGV)
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            class Foo
         | 
| 19 | 
            +
              def initialize()
         | 
| 20 | 
            +
                @x = true
         | 
| 21 | 
            +
                @y = 58
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
              def to_json()
         | 
| 24 | 
            +
                %{{"x":#{@x},"y":#{@y}}}
         | 
| 25 | 
            +
              end
         | 
| 26 | 
            +
              def to_hash()
         | 
| 27 | 
            +
                { 'x' => @x, 'y' => @y }
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
            end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            iter = 100000
         | 
| 32 | 
            +
            s = %{
         | 
| 33 | 
            +
            { "class": "Foo::Bar",
         | 
| 34 | 
            +
              "attr1": [ true, [false, [12345, null], 3.967, ["something", false], null]],
         | 
| 35 | 
            +
              "attr2": { "one": 1 }
         | 
| 36 | 
            +
            }
         | 
| 37 | 
            +
            }
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            obj = Oj.load(s)
         | 
| 40 | 
            +
            obj["foo"] = Foo.new()
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            Oj.default_options = { :indent => 0, :effort => :internal }
         | 
| 43 | 
            +
             | 
| 44 | 
            +
            puts
         | 
| 45 | 
            +
             | 
| 46 | 
            +
            start = Time.now
         | 
| 47 | 
            +
            iter.times do
         | 
| 48 | 
            +
              Oj.load(s)
         | 
| 49 | 
            +
            end
         | 
| 50 | 
            +
            dt = Time.now - start
         | 
| 51 | 
            +
            puts "%d Oj.load()s in %0.3f seconds or %0.1f loads/msec" % [iter, dt, iter/dt/1000.0]
         | 
| 52 | 
            +
             | 
| 53 | 
            +
            start = Time.now
         | 
| 54 | 
            +
            iter.times do
         | 
| 55 | 
            +
              Yajl::Parser.parse(s)
         | 
| 56 | 
            +
            end
         | 
| 57 | 
            +
            dt = Time.now - start
         | 
| 58 | 
            +
            puts "%d Yajl::Parser.parse()s in %0.3f seconds or %0.1f parses/msec" % [iter, dt, iter/dt/1000.0]
         | 
| 59 | 
            +
             | 
| 60 | 
            +
            puts
         | 
| 61 | 
            +
             | 
| 62 | 
            +
            start = Time.now
         | 
| 63 | 
            +
            iter.times do
         | 
| 64 | 
            +
              Oj.dump(obj)
         | 
| 65 | 
            +
            end
         | 
| 66 | 
            +
            dt = Time.now - start
         | 
| 67 | 
            +
            puts "%d Oj.dump()s in %0.3f seconds or %0.1f dumps/msec" % [iter, dt, iter/dt/1000.0]
         | 
| 68 | 
            +
             | 
| 69 | 
            +
            start = Time.now
         | 
| 70 | 
            +
            iter.times do
         | 
| 71 | 
            +
              Yajl::Encoder.encode(obj)
         | 
| 72 | 
            +
            end
         | 
| 73 | 
            +
            dt = Time.now - start
         | 
| 74 | 
            +
            puts "%d Yajl::Encoder.encode()s in %0.3f seconds or %0.1f encodes/msec" % [iter, dt, iter/dt/1000.0]
         | 
| 75 | 
            +
             | 
| 76 | 
            +
            puts
         | 
| @@ -0,0 +1,213 @@ | |
| 1 | 
            +
            #!/usr/bin/env ruby -wW1
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            $: << '.'
         | 
| 4 | 
            +
            $: << '..'
         | 
| 5 | 
            +
            $: << '../lib'
         | 
| 6 | 
            +
            $: << '../ext'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            if __FILE__ == $0
         | 
| 9 | 
            +
              if (i = ARGV.index('-I'))
         | 
| 10 | 
            +
                x,path = ARGV.slice!(i, 2)
         | 
| 11 | 
            +
                $: << path
         | 
| 12 | 
            +
              end
         | 
| 13 | 
            +
            end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            require 'optparse'
         | 
| 16 | 
            +
            require 'ox'
         | 
| 17 | 
            +
            require 'oj'
         | 
| 18 | 
            +
            require 'perf'
         | 
| 19 | 
            +
            require 'sample'
         | 
| 20 | 
            +
            require 'files'
         | 
| 21 | 
            +
             | 
| 22 | 
            +
            $verbose = 0
         | 
| 23 | 
            +
            $circular = false
         | 
| 24 | 
            +
            $indent = 0
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            do_sample = false
         | 
| 27 | 
            +
            do_files = false
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            do_load = false
         | 
| 30 | 
            +
            do_dump = false
         | 
| 31 | 
            +
            do_read = false
         | 
| 32 | 
            +
            do_write = false
         | 
| 33 | 
            +
            $iter = 1000
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            opts = OptionParser.new
         | 
| 36 | 
            +
            opts.on("-v", "increase verbosity")                         { $verbose += 1 }
         | 
| 37 | 
            +
             | 
| 38 | 
            +
            opts.on("-c", "circular options")                           { $circular = true }
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            opts.on("-s", "load and dump as sample Ruby object")        { do_sample = true }
         | 
| 41 | 
            +
            opts.on("-f", "load and dump as files Ruby object")         { do_files = true }
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            opts.on("-l", "load")                                       { do_load = true }
         | 
| 44 | 
            +
            opts.on("-d", "dump")                                       { do_dump = true }
         | 
| 45 | 
            +
            opts.on("-r", "read")                                       { do_read = true }
         | 
| 46 | 
            +
            opts.on("-w", "write")                                      { do_write = true }
         | 
| 47 | 
            +
            opts.on("-a", "load, dump, read and write")                 { do_load = true; do_dump = true; do_read = true; do_write = true }
         | 
| 48 | 
            +
             | 
| 49 | 
            +
            opts.on("-i", "--iterations [Int]", Integer, "iterations")  { |i| $iter = i }
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            opts.on("-h", "--help", "Show this display")                { puts opts; Process.exit!(0) }
         | 
| 52 | 
            +
            files = opts.parse(ARGV)
         | 
| 53 | 
            +
             | 
| 54 | 
            +
            if files.empty?
         | 
| 55 | 
            +
              data = []
         | 
| 56 | 
            +
              obj = do_sample ? sample_doc(2) : files('..')
         | 
| 57 | 
            +
              mars = Marshal.dump(obj)
         | 
| 58 | 
            +
              xml = Ox.dump(obj, :indent => $indent, circular: $circular)
         | 
| 59 | 
            +
              json = Oj.dump(obj, :indent => $indent, circular: $circular)
         | 
| 60 | 
            +
              File.open('sample.xml', 'w') { |f| f.write(xml) }
         | 
| 61 | 
            +
              File.open('sample.json', 'w') { |f| f.write(json) }
         | 
| 62 | 
            +
              File.open('sample.marshal', 'w') { |f| f.write(mars) }
         | 
| 63 | 
            +
              data << { :file => 'sample.xml', :obj => obj, :xml => xml, :marshal => mars, :json => json }
         | 
| 64 | 
            +
            else
         | 
| 65 | 
            +
              puts "loading and parsing #{files}\n\n"
         | 
| 66 | 
            +
              # TBD change to allow xml and json
         | 
| 67 | 
            +
              data = files.map do |f|
         | 
| 68 | 
            +
                xml = File.read(f)
         | 
| 69 | 
            +
                obj = Ox.load(xml);
         | 
| 70 | 
            +
                mars = Marshal.dump(obj)
         | 
| 71 | 
            +
                json = Oj.dump(obj, :indent => $indent, circular: $circular)
         | 
| 72 | 
            +
                { :file => f, :obj => obj, :xml => xml, :marshal => mars, :json => json }
         | 
| 73 | 
            +
              end
         | 
| 74 | 
            +
            end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
            $ox_load_time = 0
         | 
| 77 | 
            +
            $mars_load_time = 0
         | 
| 78 | 
            +
            $ox_dump_time = 0
         | 
| 79 | 
            +
            $oj_dump_time = 0
         | 
| 80 | 
            +
            $mars_dump_time = 0
         | 
| 81 | 
            +
             | 
| 82 | 
            +
            def perf_load(d)
         | 
| 83 | 
            +
              filename = d[:file]
         | 
| 84 | 
            +
              marshal_filename = 'sample.marshal'
         | 
| 85 | 
            +
              xml = d[:xml]
         | 
| 86 | 
            +
              mars = d[:marshal]
         | 
| 87 | 
            +
              json = d[:json]
         | 
| 88 | 
            +
             | 
| 89 | 
            +
              if 0 < $verbose
         | 
| 90 | 
            +
                obj = Ox.load(xml, :mode => :object, :trace => $verbose)
         | 
| 91 | 
            +
                return
         | 
| 92 | 
            +
              end
         | 
| 93 | 
            +
              start = Time.now
         | 
| 94 | 
            +
              (1..$iter).each do
         | 
| 95 | 
            +
                obj = Ox.load(xml, :mode => :object)
         | 
| 96 | 
            +
              end
         | 
| 97 | 
            +
              $ox_load_time = Time.now - start
         | 
| 98 | 
            +
              puts "Parsing #{$iter} times with Ox took #{$ox_load_time} seconds."
         | 
| 99 | 
            +
             | 
| 100 | 
            +
              start = Time.now
         | 
| 101 | 
            +
              (1..$iter).each do
         | 
| 102 | 
            +
                obj = Oj.load(json, :mode => :object)
         | 
| 103 | 
            +
              end
         | 
| 104 | 
            +
              $oj_load_time = Time.now - start
         | 
| 105 | 
            +
              puts "Parsing #{$iter} times with Oj took #{$oj_load_time} seconds."
         | 
| 106 | 
            +
              
         | 
| 107 | 
            +
              start = Time.now
         | 
| 108 | 
            +
              (1..$iter).each do
         | 
| 109 | 
            +
                obj = Marshal.load(mars)
         | 
| 110 | 
            +
              end
         | 
| 111 | 
            +
              $mars_load_time = Time.now - start
         | 
| 112 | 
            +
              puts "Marshalling #{$iter} times took #{$mars_load_time} seconds."
         | 
| 113 | 
            +
              puts ">>> Ox is %0.1f faster than Marshal loading.\n\n" % [$mars_load_time/$ox_load_time]
         | 
| 114 | 
            +
            end
         | 
| 115 | 
            +
             | 
| 116 | 
            +
            def perf_dump(d)
         | 
| 117 | 
            +
              obj = d[:obj]
         | 
| 118 | 
            +
             | 
| 119 | 
            +
              start = Time.now
         | 
| 120 | 
            +
              (1..$iter).each do
         | 
| 121 | 
            +
                xml = Ox.dump(obj, :indent => $indent, :circular => $circular)
         | 
| 122 | 
            +
                #puts "*** ox:\n#{xml}"
         | 
| 123 | 
            +
              end
         | 
| 124 | 
            +
              $ox_dump_time = Time.now - start
         | 
| 125 | 
            +
              puts "Ox dumping #{$iter} times with ox took #{$ox_dump_time} seconds."
         | 
| 126 | 
            +
             | 
| 127 | 
            +
              Oj.default_options = {:indent => $indent}
         | 
| 128 | 
            +
              start = Time.now
         | 
| 129 | 
            +
              (1..$iter).each do
         | 
| 130 | 
            +
                json = Oj.dump(obj)
         | 
| 131 | 
            +
              end
         | 
| 132 | 
            +
              $oj_dump_time = Time.now - start
         | 
| 133 | 
            +
              puts "Oj dumping #{$iter} times with oj took #{$oj_dump_time} seconds."
         | 
| 134 | 
            +
             | 
| 135 | 
            +
              obj = d[:obj]
         | 
| 136 | 
            +
              start = Time.now
         | 
| 137 | 
            +
              (1..$iter).each do
         | 
| 138 | 
            +
                m = Marshal.dump(obj)
         | 
| 139 | 
            +
              end
         | 
| 140 | 
            +
              $mars_dump_time = Time.now - start
         | 
| 141 | 
            +
              puts "Marshal dumping #{$iter} times took #{$mars_dump_time} seconds."
         | 
| 142 | 
            +
              puts ">>> Ox is %0.1f faster than Marshal dumping.\n\n" % [$mars_dump_time/$ox_dump_time]
         | 
| 143 | 
            +
            end
         | 
| 144 | 
            +
             | 
| 145 | 
            +
            def perf_read(d)
         | 
| 146 | 
            +
              ox_read_time = 0
         | 
| 147 | 
            +
              mars_read_time = 0
         | 
| 148 | 
            +
             | 
| 149 | 
            +
              filename = d[:file]
         | 
| 150 | 
            +
              marshal_filename = 'sample.marshal'
         | 
| 151 | 
            +
              xml = d[:xml]
         | 
| 152 | 
            +
              mars = d[:marshal]
         | 
| 153 | 
            +
             | 
| 154 | 
            +
              # now load from the file
         | 
| 155 | 
            +
              start = Time.now
         | 
| 156 | 
            +
              (1..$iter).each do
         | 
| 157 | 
            +
                obj = Ox.load_file(filename, :mode => :object)
         | 
| 158 | 
            +
              end
         | 
| 159 | 
            +
              ox_read_time = Time.now - start
         | 
| 160 | 
            +
              puts "Loading and parsing #{$iter} times with ox took #{ox_read_time} seconds."
         | 
| 161 | 
            +
             | 
| 162 | 
            +
              start = Time.now
         | 
| 163 | 
            +
              (1..$iter).each do
         | 
| 164 | 
            +
                m = File.read(marshal_filename)
         | 
| 165 | 
            +
                obj = Marshal.load(m)
         | 
| 166 | 
            +
              end
         | 
| 167 | 
            +
              mars_read_time = Time.now - start
         | 
| 168 | 
            +
              puts "Reading and marshalling #{$iter} times took #{mars_read_time} seconds."
         | 
| 169 | 
            +
              puts ">>> Ox is %0.1f faster than Marshal loading and parsing.\n\n" % [mars_read_time/ox_read_time]
         | 
| 170 | 
            +
             | 
| 171 | 
            +
            end
         | 
| 172 | 
            +
             | 
| 173 | 
            +
            def perf_write(d)
         | 
| 174 | 
            +
              ox_write_time = 0
         | 
| 175 | 
            +
              mars_write_time = 0
         | 
| 176 | 
            +
              
         | 
| 177 | 
            +
              ox_filename = 'out.xml'
         | 
| 178 | 
            +
              marshal_filename = 'out.marshal'
         | 
| 179 | 
            +
              obj = d[:obj]
         | 
| 180 | 
            +
             | 
| 181 | 
            +
              start = Time.now
         | 
| 182 | 
            +
              (1..$iter).each do
         | 
| 183 | 
            +
                xml = Ox.to_file(ox_filename, obj, :indent => $indent)
         | 
| 184 | 
            +
              end
         | 
| 185 | 
            +
              ox_write_time = Time.now - start
         | 
| 186 | 
            +
              puts "Ox dumping #{$iter} times with ox took #{ox_write_time} seconds."
         | 
| 187 | 
            +
             | 
| 188 | 
            +
              start = Time.now
         | 
| 189 | 
            +
              (1..$iter).each do
         | 
| 190 | 
            +
                m = Marshal.dump(obj, circular: $circular)
         | 
| 191 | 
            +
                File.open(marshal_filename, "w") { |f| f.write(m) }
         | 
| 192 | 
            +
              end
         | 
| 193 | 
            +
              mars_write_time = Time.now - start
         | 
| 194 | 
            +
              puts "Marshal dumping and writing #{$iter} times took #{mars_write_time} seconds."
         | 
| 195 | 
            +
              puts ">>> Ox is %0.1f faster than Marshal dumping.\n\n" % [mars_write_time/ox_write_time]
         | 
| 196 | 
            +
             | 
| 197 | 
            +
            end
         | 
| 198 | 
            +
             | 
| 199 | 
            +
            #if do_sample or do_files
         | 
| 200 | 
            +
              data.each do |d|
         | 
| 201 | 
            +
                puts "Using file #{d[:file]}."
         | 
| 202 | 
            +
                
         | 
| 203 | 
            +
                perf_load(d) if do_load
         | 
| 204 | 
            +
                perf_dump(d) if do_dump
         | 
| 205 | 
            +
                if do_load and do_dump
         | 
| 206 | 
            +
                  puts ">>> Ox is %0.1f faster than Marshal dumping and loading.\n\n" % [($mars_load_time + $mars_dump_time)/($ox_load_time + $ox_dump_time)] unless 0 == $mars_load_time
         | 
| 207 | 
            +
                end
         | 
| 208 | 
            +
             | 
| 209 | 
            +
                perf_read(d) if do_read
         | 
| 210 | 
            +
                perf_write(d) if do_write
         | 
| 211 | 
            +
             | 
| 212 | 
            +
              end
         | 
| 213 | 
            +
            #end
         |