oj 2.1.2 → 2.1.3
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.
- checksums.yaml +4 -4
- data/README.md +3 -23
- data/ext/oj/dump.c +0 -1
- data/ext/oj/hash.c +1 -0
- data/ext/oj/hash_test.c +8 -2
- data/ext/oj/object.c +19 -0
- data/ext/oj/oj.c +28 -3
- data/ext/oj/val_stack.h +1 -0
- data/lib/oj/version.rb +1 -1
- metadata +2 -38
- data/test/a.rb +0 -38
- data/test/bug.rb +0 -15
- data/test/files.rb +0 -29
- data/test/foo.rb +0 -24
- data/test/mj.rb +0 -48
- data/test/perf.rb +0 -107
- data/test/perf_compat.rb +0 -128
- data/test/perf_fast.rb +0 -164
- data/test/perf_object.rb +0 -136
- data/test/perf_saj.rb +0 -109
- data/test/perf_scp.rb +0 -151
- data/test/perf_simple.rb +0 -287
- data/test/perf_strict.rb +0 -127
- data/test/sample.rb +0 -55
- data/test/sample/change.rb +0 -14
- data/test/sample/dir.rb +0 -19
- data/test/sample/doc.rb +0 -36
- data/test/sample/file.rb +0 -48
- data/test/sample/group.rb +0 -16
- data/test/sample/hasprops.rb +0 -16
- data/test/sample/layer.rb +0 -12
- data/test/sample/line.rb +0 -20
- data/test/sample/oval.rb +0 -10
- data/test/sample/rect.rb +0 -10
- data/test/sample/shape.rb +0 -35
- data/test/sample/text.rb +0 -20
- data/test/sample_json.rb +0 -37
- data/test/test_compat.rb +0 -342
- data/test/test_fast.rb +0 -416
- data/test/test_mimic.rb +0 -208
- data/test/test_mimic_after.rb +0 -35
- data/test/test_object.rb +0 -390
- data/test/test_saj.rb +0 -184
- data/test/test_scp.rb +0 -224
- data/test/test_strict.rb +0 -259
- data/test/tests.rb +0 -1017
    
        data/test/perf_scp.rb
    DELETED
    
    | @@ -1,151 +0,0 @@ | |
| 1 | 
            -
            #!/usr/bin/env ruby -wW1
         | 
| 2 | 
            -
            # encoding: UTF-8
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            $: << '.'
         | 
| 5 | 
            -
            $: << File.join(File.dirname(__FILE__), "../lib")
         | 
| 6 | 
            -
            $: << File.join(File.dirname(__FILE__), "../ext")
         | 
| 7 | 
            -
             | 
| 8 | 
            -
            require 'optparse'
         | 
| 9 | 
            -
            require 'yajl'
         | 
| 10 | 
            -
            require 'perf'
         | 
| 11 | 
            -
            require 'json'
         | 
| 12 | 
            -
            require 'json/ext'
         | 
| 13 | 
            -
            require 'oj'
         | 
| 14 | 
            -
             | 
| 15 | 
            -
            $verbose = false
         | 
| 16 | 
            -
            $indent = 0
         | 
| 17 | 
            -
            $iter = 50000
         | 
| 18 | 
            -
            $with_bignum = false
         | 
| 19 | 
            -
            $size = 0
         | 
| 20 | 
            -
             | 
| 21 | 
            -
            opts = OptionParser.new
         | 
| 22 | 
            -
            opts.on("-v", "verbose")                                  { $verbose = true }
         | 
| 23 | 
            -
            opts.on("-c", "--count [Int]", Integer, "iterations")     { |i| $iter = i }
         | 
| 24 | 
            -
            opts.on("-i", "--indent [Int]", Integer, "indentation")   { |i| $indent = i }
         | 
| 25 | 
            -
            opts.on("-s", "--size [Int]", Integer, "size (~Kbytes)")    { |i| $size = i }
         | 
| 26 | 
            -
            opts.on("-b", "with bignum")                                { $with_bignum = true }
         | 
| 27 | 
            -
            opts.on("-h", "--help", "Show this display")              { puts opts; Process.exit!(0) }
         | 
| 28 | 
            -
            files = opts.parse(ARGV)
         | 
| 29 | 
            -
             | 
| 30 | 
            -
            $obj = {
         | 
| 31 | 
            -
              'a' => 'Alpha', # string
         | 
| 32 | 
            -
              'b' => true,    # boolean
         | 
| 33 | 
            -
              'c' => 12345,   # number
         | 
| 34 | 
            -
              'd' => [ true, [false, [-123456789, nil], 3.9676, ['Something else.', false], nil]], # mix it up array
         | 
| 35 | 
            -
              'e' => { 'zero' => nil, 'one' => 1, 'two' => 2, 'three' => [3], 'four' => [0, 1, 2, 3, 4] }, # hash
         | 
| 36 | 
            -
              'f' => nil,     # nil
         | 
| 37 | 
            -
              'h' => { 'a' => { 'b' => { 'c' => { 'd' => {'e' => { 'f' => { 'g' => nil }}}}}}}, # deep hash, not that deep
         | 
| 38 | 
            -
              'i' => [[[[[[[nil]]]]]]]  # deep array, again, not that deep
         | 
| 39 | 
            -
            }
         | 
| 40 | 
            -
            $obj['g'] = 12345678901234567890123456789 if $with_bignum
         | 
| 41 | 
            -
             | 
| 42 | 
            -
            if 0 < $size
         | 
| 43 | 
            -
              o = $obj
         | 
| 44 | 
            -
              $obj = []
         | 
| 45 | 
            -
              (4 * $size).times do
         | 
| 46 | 
            -
                $obj << o
         | 
| 47 | 
            -
              end
         | 
| 48 | 
            -
            end
         | 
| 49 | 
            -
             | 
| 50 | 
            -
            Oj.default_options = { :indent => $indent, :mode => :compat }
         | 
| 51 | 
            -
             | 
| 52 | 
            -
            $json = Oj.dump($obj)
         | 
| 53 | 
            -
            $failed = {} # key is same as String used in tests later
         | 
| 54 | 
            -
             | 
| 55 | 
            -
            class AllSaj < Oj::Saj
         | 
| 56 | 
            -
              def initialize()
         | 
| 57 | 
            -
              end
         | 
| 58 | 
            -
             | 
| 59 | 
            -
              def hash_start(key)
         | 
| 60 | 
            -
              end
         | 
| 61 | 
            -
             | 
| 62 | 
            -
              def hash_end(key)
         | 
| 63 | 
            -
              end
         | 
| 64 | 
            -
             | 
| 65 | 
            -
              def array_start(key)
         | 
| 66 | 
            -
              end
         | 
| 67 | 
            -
             | 
| 68 | 
            -
              def array_end(key)
         | 
| 69 | 
            -
              end
         | 
| 70 | 
            -
             | 
| 71 | 
            -
              def add_value(value, key)
         | 
| 72 | 
            -
              end
         | 
| 73 | 
            -
            end # AllSaj
         | 
| 74 | 
            -
             | 
| 75 | 
            -
            class NoSaj < Oj::Saj
         | 
| 76 | 
            -
              def initialize()
         | 
| 77 | 
            -
              end
         | 
| 78 | 
            -
            end # NoSaj
         | 
| 79 | 
            -
             | 
| 80 | 
            -
            class NoHandler < Oj::ScHandler
         | 
| 81 | 
            -
              def initialize()
         | 
| 82 | 
            -
              end
         | 
| 83 | 
            -
            end # NoHandler
         | 
| 84 | 
            -
             | 
| 85 | 
            -
            class AllHandler < Oj::ScHandler
         | 
| 86 | 
            -
              def initialize()
         | 
| 87 | 
            -
              end
         | 
| 88 | 
            -
             | 
| 89 | 
            -
              def hash_start()
         | 
| 90 | 
            -
                return nil
         | 
| 91 | 
            -
              end
         | 
| 92 | 
            -
             | 
| 93 | 
            -
              def hash_end()
         | 
| 94 | 
            -
              end
         | 
| 95 | 
            -
             | 
| 96 | 
            -
              def array_start()
         | 
| 97 | 
            -
                return nil
         | 
| 98 | 
            -
              end
         | 
| 99 | 
            -
             | 
| 100 | 
            -
              def array_end()
         | 
| 101 | 
            -
              end
         | 
| 102 | 
            -
             | 
| 103 | 
            -
              def add_value(value)
         | 
| 104 | 
            -
              end
         | 
| 105 | 
            -
             | 
| 106 | 
            -
              def hash_set(h, key, value)
         | 
| 107 | 
            -
              end
         | 
| 108 | 
            -
              
         | 
| 109 | 
            -
              def array_append(a, value)
         | 
| 110 | 
            -
              end
         | 
| 111 | 
            -
             | 
| 112 | 
            -
            end # AllHandler
         | 
| 113 | 
            -
             | 
| 114 | 
            -
            saj_handler = AllSaj.new()
         | 
| 115 | 
            -
            no_saj = NoSaj.new()
         | 
| 116 | 
            -
             | 
| 117 | 
            -
            sc_handler = AllHandler.new()
         | 
| 118 | 
            -
            no_handler = NoHandler.new()
         | 
| 119 | 
            -
             | 
| 120 | 
            -
            def capture_error(tag, orig, load_key, dump_key, &blk)
         | 
| 121 | 
            -
              begin
         | 
| 122 | 
            -
                obj = blk.call(orig)
         | 
| 123 | 
            -
                raise "#{tag} #{dump_key} and #{load_key} did not return the same object as the original." unless orig == obj
         | 
| 124 | 
            -
              rescue Exception => e
         | 
| 125 | 
            -
                $failed[tag] = "#{e.class}: #{e.message}"
         | 
| 126 | 
            -
              end
         | 
| 127 | 
            -
            end
         | 
| 128 | 
            -
             | 
| 129 | 
            -
            # Verify that all packages dump and load correctly and return the same Object as the original.
         | 
| 130 | 
            -
            capture_error('Yajl', $obj, 'encode', 'parse') { |o| Yajl::Parser.parse(Yajl::Encoder.encode(o)) }
         | 
| 131 | 
            -
            capture_error('JSON::Ext', $obj, 'generate', 'parse') { |o| JSON.generator = JSON::Ext::Generator; JSON::Ext::Parser.new(JSON.generate(o)).parse }
         | 
| 132 | 
            -
             | 
| 133 | 
            -
            if $verbose
         | 
| 134 | 
            -
              puts "json:\n#{$json}\n"
         | 
| 135 | 
            -
            end
         | 
| 136 | 
            -
             | 
| 137 | 
            -
            puts '-' * 80
         | 
| 138 | 
            -
            puts "Parse Performance"
         | 
| 139 | 
            -
            perf = Perf.new()
         | 
| 140 | 
            -
            perf.add('Oj::Saj', 'all') { Oj.saj_parse(saj_handler, $json) }
         | 
| 141 | 
            -
            perf.add('Oj::Saj', 'none') { Oj.saj_parse(no_saj, $json) }
         | 
| 142 | 
            -
            perf.add('Oj::Scp', 'all') { Oj.sc_parse(sc_handler, $json) }
         | 
| 143 | 
            -
            perf.add('Oj::Scp', 'none') { Oj.sc_parse(no_handler, $json) }
         | 
| 144 | 
            -
            perf.add('Yajl', 'parse') { Yajl::Parser.parse($json) } unless $failed.has_key?('Yajl')
         | 
| 145 | 
            -
            perf.add('JSON::Ext', 'parse') { JSON::Ext::Parser.new($json).parse } unless $failed.has_key?('JSON::Ext')
         | 
| 146 | 
            -
            perf.run($iter)
         | 
| 147 | 
            -
             | 
| 148 | 
            -
            unless $failed.empty?
         | 
| 149 | 
            -
              puts "The following packages were not included for the reason listed"
         | 
| 150 | 
            -
              $failed.each { |tag,msg| puts "***** #{tag}: #{msg}" }
         | 
| 151 | 
            -
            end
         | 
    
        data/test/perf_simple.rb
    DELETED
    
    | @@ -1,287 +0,0 @@ | |
| 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 'optparse'
         | 
| 8 | 
            -
            require 'yajl'
         | 
| 9 | 
            -
            require 'json'
         | 
| 10 | 
            -
            require 'json/pure'
         | 
| 11 | 
            -
            require 'json/ext'
         | 
| 12 | 
            -
            require 'msgpack'
         | 
| 13 | 
            -
            require 'oj'
         | 
| 14 | 
            -
            require 'ox'
         | 
| 15 | 
            -
             | 
| 16 | 
            -
            class Jazz
         | 
| 17 | 
            -
              def initialize()
         | 
| 18 | 
            -
                @boolean = true
         | 
| 19 | 
            -
                @number = 58
         | 
| 20 | 
            -
                @string = "A string"
         | 
| 21 | 
            -
                @array = [true, false, nil]
         | 
| 22 | 
            -
                @hash = { 'one' => 1, 'two' => 2 }
         | 
| 23 | 
            -
              end
         | 
| 24 | 
            -
              def to_json()
         | 
| 25 | 
            -
                %{
         | 
| 26 | 
            -
                { "boolean":#{@boolean},
         | 
| 27 | 
            -
                  "number":#{@number},
         | 
| 28 | 
            -
                  "string":#{@string},
         | 
| 29 | 
            -
                  "array":#{@array},
         | 
| 30 | 
            -
                  "hash":#{@hash},
         | 
| 31 | 
            -
                }
         | 
| 32 | 
            -
            }
         | 
| 33 | 
            -
              end
         | 
| 34 | 
            -
              def to_hash()
         | 
| 35 | 
            -
                { 'boolean' => @boolean,
         | 
| 36 | 
            -
                  'number' => @number,
         | 
| 37 | 
            -
                  'string' => @string,
         | 
| 38 | 
            -
                  'array' => @array,
         | 
| 39 | 
            -
                  'hash' => @hash,
         | 
| 40 | 
            -
                }
         | 
| 41 | 
            -
              end
         | 
| 42 | 
            -
              def to_msgpack(out='')
         | 
| 43 | 
            -
                to_hash().to_msgpack(out)
         | 
| 44 | 
            -
              end
         | 
| 45 | 
            -
            end
         | 
| 46 | 
            -
             | 
| 47 | 
            -
            $indent = 2
         | 
| 48 | 
            -
            $iter = 10000
         | 
| 49 | 
            -
            $with_object = true
         | 
| 50 | 
            -
            $with_bignum = true
         | 
| 51 | 
            -
            $with_nums = true
         | 
| 52 | 
            -
             | 
| 53 | 
            -
            opts = OptionParser.new
         | 
| 54 | 
            -
            opts.on("-c", "--count [Int]", Integer, "iterations")       { |i| $iter = i }
         | 
| 55 | 
            -
            opts.on("-i", "--indent [Int]", Integer, "indentation")     { |i| $indent = i }
         | 
| 56 | 
            -
            opts.on("-o", "without objects")                            { $with_object = false }
         | 
| 57 | 
            -
            opts.on("-b", "without bignum")                             { $with_bignum = false }
         | 
| 58 | 
            -
            opts.on("-n", "without numbers")                            { $with_nums = false }
         | 
| 59 | 
            -
            opts.on("-h", "--help", "Show this display")                { puts opts; Process.exit!(0) }
         | 
| 60 | 
            -
            files = opts.parse(ARGV)
         | 
| 61 | 
            -
             | 
| 62 | 
            -
            if $with_nums
         | 
| 63 | 
            -
              obj = {
         | 
| 64 | 
            -
                'a' => 'Alpha',
         | 
| 65 | 
            -
                'b' => true,
         | 
| 66 | 
            -
                'c' => 12345,
         | 
| 67 | 
            -
                'd' => [ true, [false, [12345, nil], 3.967, ['something', false], nil]],
         | 
| 68 | 
            -
                'e' => { 'one' => 1, 'two' => 2 },
         | 
| 69 | 
            -
                'f' => nil,
         | 
| 70 | 
            -
              }
         | 
| 71 | 
            -
              obj['g'] = Jazz.new() if $with_object
         | 
| 72 | 
            -
              obj['h'] = 12345678901234567890123456789 if $with_bignum
         | 
| 73 | 
            -
            else
         | 
| 74 | 
            -
              obj = {
         | 
| 75 | 
            -
                'a' => 'Alpha',
         | 
| 76 | 
            -
                'b' => true,
         | 
| 77 | 
            -
                'c' => '12345',
         | 
| 78 | 
            -
                'd' => [ true, [false, ['12345', nil], '3.967', ['something', false], nil]],
         | 
| 79 | 
            -
                'e' => { 'one' => '1', 'two' => '2' },
         | 
| 80 | 
            -
                'f' => nil,
         | 
| 81 | 
            -
              }
         | 
| 82 | 
            -
            end
         | 
| 83 | 
            -
             | 
| 84 | 
            -
            Oj.default_options = { :indent => $indent, :mode => :object }
         | 
| 85 | 
            -
             | 
| 86 | 
            -
            s = Oj.dump(obj)
         | 
| 87 | 
            -
             | 
| 88 | 
            -
            xml = Ox.dump(obj, :indent => $indent)
         | 
| 89 | 
            -
             | 
| 90 | 
            -
            puts
         | 
| 91 | 
            -
             | 
| 92 | 
            -
            # Put Oj in strict mode so it only create JSON native types instead of the
         | 
| 93 | 
            -
            # original Ruby Objects. None of the other packages other than Ox support
         | 
| 94 | 
            -
            # Object recreation so no need for Oj to do it in the performance tests.
         | 
| 95 | 
            -
            Oj.default_options = { :mode => :strict }
         | 
| 96 | 
            -
            parse_results = { :oj => 0.0, :yajl => 0.0, :msgpack => 0.0, :pure => 0.0, :ext => 0.0, :ox => 0.0 }
         | 
| 97 | 
            -
             | 
| 98 | 
            -
            start = Time.now
         | 
| 99 | 
            -
            $iter.times do
         | 
| 100 | 
            -
              Oj.load(s)
         | 
| 101 | 
            -
            end
         | 
| 102 | 
            -
            dt = Time.now - start
         | 
| 103 | 
            -
            base_dt = dt
         | 
| 104 | 
            -
            parse_results[:oj] = dt
         | 
| 105 | 
            -
            puts "%d Oj.load()s in %0.3f seconds or %0.1f loads/msec" % [$iter, dt, $iter/dt/1000.0]
         | 
| 106 | 
            -
             | 
| 107 | 
            -
            start = Time.now
         | 
| 108 | 
            -
            $iter.times do
         | 
| 109 | 
            -
              Yajl::Parser.parse(s)
         | 
| 110 | 
            -
            end
         | 
| 111 | 
            -
            dt = Time.now - start
         | 
| 112 | 
            -
            if base_dt < dt
         | 
| 113 | 
            -
              base_dt = dt
         | 
| 114 | 
            -
              base_name = 'Yajl'
         | 
| 115 | 
            -
            end
         | 
| 116 | 
            -
            parse_results[:yajl] = dt
         | 
| 117 | 
            -
            puts "%d Yajl::Parser.parse()s in %0.3f seconds or %0.1f parses/msec" % [$iter, dt, $iter/dt/1000.0]
         | 
| 118 | 
            -
             | 
| 119 | 
            -
            begin
         | 
| 120 | 
            -
              JSON.parser = JSON::Ext::Parser
         | 
| 121 | 
            -
              start = Time.now
         | 
| 122 | 
            -
              $iter.times do
         | 
| 123 | 
            -
                JSON.parse(s)
         | 
| 124 | 
            -
              end
         | 
| 125 | 
            -
              dt = Time.now - start
         | 
| 126 | 
            -
              if base_dt < dt
         | 
| 127 | 
            -
                base_dt = dt
         | 
| 128 | 
            -
                base_name = 'JSON::Ext'
         | 
| 129 | 
            -
              end
         | 
| 130 | 
            -
              parse_results[:ext] = dt
         | 
| 131 | 
            -
              puts "%d JSON::Ext::Parser parse()s in %0.3f seconds or %0.1f parses/msec" % [$iter, dt, $iter/dt/1000.0]
         | 
| 132 | 
            -
            rescue Exception => e
         | 
| 133 | 
            -
              puts "JSON::Ext failed: #{e.class}: #{e.message}"
         | 
| 134 | 
            -
            end
         | 
| 135 | 
            -
             | 
| 136 | 
            -
            begin
         | 
| 137 | 
            -
              JSON.parser = JSON::Pure::Parser
         | 
| 138 | 
            -
              start = Time.now
         | 
| 139 | 
            -
              $iter.times do
         | 
| 140 | 
            -
                JSON.parse(s)
         | 
| 141 | 
            -
              end
         | 
| 142 | 
            -
              dt = Time.now - start
         | 
| 143 | 
            -
              if base_dt < dt
         | 
| 144 | 
            -
                base_dt = dt
         | 
| 145 | 
            -
                base_name = 'JSON::Pure'
         | 
| 146 | 
            -
              end
         | 
| 147 | 
            -
              parse_results[:pure] = dt
         | 
| 148 | 
            -
              puts "%d JSON::Pure::Parser parse()s in %0.3f seconds or %0.1f parses/msec" % [$iter, dt, $iter/dt/1000.0]
         | 
| 149 | 
            -
            rescue Exception => e
         | 
| 150 | 
            -
              puts "JSON::Pure failed: #{e.class}: #{e.message}"
         | 
| 151 | 
            -
            end
         | 
| 152 | 
            -
             | 
| 153 | 
            -
            begin
         | 
| 154 | 
            -
              mp = MessagePack.pack(obj)
         | 
| 155 | 
            -
              start = Time.now
         | 
| 156 | 
            -
              $iter.times do
         | 
| 157 | 
            -
                MessagePack.unpack(mp)
         | 
| 158 | 
            -
              end
         | 
| 159 | 
            -
              dt = Time.now - start
         | 
| 160 | 
            -
              if base_dt < dt
         | 
| 161 | 
            -
                base_dt = dt
         | 
| 162 | 
            -
                base_name = 'MessagePack'
         | 
| 163 | 
            -
              end
         | 
| 164 | 
            -
              parse_results[:msgpack] = dt
         | 
| 165 | 
            -
              puts "%d MessagePack.unpack()s in %0.3f seconds or %0.1f packs/msec" % [$iter, dt, $iter/dt/1000.0]
         | 
| 166 | 
            -
            rescue Exception => e
         | 
| 167 | 
            -
              puts "MessagePack failed: #{e.class}: #{e.message}"
         | 
| 168 | 
            -
            end
         | 
| 169 | 
            -
             | 
| 170 | 
            -
            start = Time.now
         | 
| 171 | 
            -
            $iter.times do
         | 
| 172 | 
            -
              Ox.load(xml)
         | 
| 173 | 
            -
            end
         | 
| 174 | 
            -
            dt = Time.now - start
         | 
| 175 | 
            -
            parse_results[:ox] = dt
         | 
| 176 | 
            -
            puts "%d Ox.load()s in %0.3f seconds or %0.1f loads/msec" % [$iter, dt, $iter/dt/1000.0]
         | 
| 177 | 
            -
             | 
| 178 | 
            -
            puts "Parser results:"
         | 
| 179 | 
            -
            puts "gem       seconds  parses/msec  X faster than #{base_name} (higher is better)"
         | 
| 180 | 
            -
            parse_results.each do |name,dt|
         | 
| 181 | 
            -
              if 0.0 == dt
         | 
| 182 | 
            -
                puts "#{name} failed to generate JSON"
         | 
| 183 | 
            -
                next
         | 
| 184 | 
            -
              end
         | 
| 185 | 
            -
              puts "%-7s  %6.3f    %5.1f        %4.1f" % [name, dt, $iter/dt/1000.0, base_dt/dt]
         | 
| 186 | 
            -
            end
         | 
| 187 | 
            -
             | 
| 188 | 
            -
            puts
         | 
| 189 | 
            -
             | 
| 190 | 
            -
            # Back to object mode for best performance when dumping.
         | 
| 191 | 
            -
            Oj.default_options = { :indent => $indent, :mode => :object }
         | 
| 192 | 
            -
            dump_results = { :oj => 0.0, :yajl => 0.0, :msgpack => 0.0, :pure => 0.0, :ext => 0.0, :ox => 0.0 }
         | 
| 193 | 
            -
             | 
| 194 | 
            -
            start = Time.now
         | 
| 195 | 
            -
            $iter.times do
         | 
| 196 | 
            -
              Oj.dump(obj)
         | 
| 197 | 
            -
            end
         | 
| 198 | 
            -
            dt = Time.now - start
         | 
| 199 | 
            -
            base_dt = dt
         | 
| 200 | 
            -
            base_name = 'Oj'
         | 
| 201 | 
            -
            parse_results[:oj] = dt
         | 
| 202 | 
            -
            puts "%d Oj.dump()s in %0.3f seconds or %0.1f dumps/msec" % [$iter, dt, $iter/dt/1000.0]
         | 
| 203 | 
            -
             | 
| 204 | 
            -
            start = Time.now
         | 
| 205 | 
            -
            $iter.times do
         | 
| 206 | 
            -
              Yajl::Encoder.encode(obj)
         | 
| 207 | 
            -
            end
         | 
| 208 | 
            -
            dt = Time.now - start
         | 
| 209 | 
            -
            if base_dt < dt
         | 
| 210 | 
            -
              base_dt = dt
         | 
| 211 | 
            -
              base_name = 'Yajl'
         | 
| 212 | 
            -
            end
         | 
| 213 | 
            -
            parse_results[:yajl] = dt
         | 
| 214 | 
            -
            puts "%d Yajl::Encoder.encode()s in %0.3f seconds or %0.1f encodes/msec" % [$iter, dt, $iter/dt/1000.0]
         | 
| 215 | 
            -
             | 
| 216 | 
            -
            begin
         | 
| 217 | 
            -
              JSON.parser = JSON::Ext::Parser
         | 
| 218 | 
            -
              start = Time.now
         | 
| 219 | 
            -
              $iter.times do
         | 
| 220 | 
            -
                JSON.generate(obj)
         | 
| 221 | 
            -
              end
         | 
| 222 | 
            -
              dt = Time.now - start
         | 
| 223 | 
            -
              if base_dt < dt
         | 
| 224 | 
            -
                base_dt = dt
         | 
| 225 | 
            -
                base_name = 'JSON::Ext'
         | 
| 226 | 
            -
              end
         | 
| 227 | 
            -
              parse_results[:pure] = dt
         | 
| 228 | 
            -
              puts "%d JSON::Ext generate()s in %0.3f seconds or %0.1f generates/msec" % [$iter, dt, $iter/dt/1000.0]
         | 
| 229 | 
            -
            rescue Exception => e
         | 
| 230 | 
            -
              parse_results[:ext] = 0.0
         | 
| 231 | 
            -
              puts "JSON::Ext failed: #{e.class}: #{e.message}"
         | 
| 232 | 
            -
            end
         | 
| 233 | 
            -
             | 
| 234 | 
            -
            begin
         | 
| 235 | 
            -
              JSON.parser = JSON::Pure::Parser
         | 
| 236 | 
            -
              start = Time.now
         | 
| 237 | 
            -
              $iter.times do
         | 
| 238 | 
            -
                JSON.generate(obj)
         | 
| 239 | 
            -
              end
         | 
| 240 | 
            -
              dt = Time.now - start
         | 
| 241 | 
            -
              if base_dt < dt
         | 
| 242 | 
            -
                base_dt = dt
         | 
| 243 | 
            -
                base_name = 'JSON::Pure'
         | 
| 244 | 
            -
              end
         | 
| 245 | 
            -
              parse_results[:pure] = dt
         | 
| 246 | 
            -
              puts "%d JSON::Pure generate()s in %0.3f seconds or %0.1f generates/msec" % [$iter, dt, $iter/dt/1000.0]
         | 
| 247 | 
            -
            rescue Exception => e
         | 
| 248 | 
            -
              parse_results[:pure] = 0.0
         | 
| 249 | 
            -
              puts "JSON::Pure failed: #{e.class}: #{e.message}"
         | 
| 250 | 
            -
            end
         | 
| 251 | 
            -
             | 
| 252 | 
            -
            begin
         | 
| 253 | 
            -
              start = Time.now
         | 
| 254 | 
            -
              $iter.times do
         | 
| 255 | 
            -
                MessagePack.pack(obj)
         | 
| 256 | 
            -
              end
         | 
| 257 | 
            -
              dt = Time.now - start
         | 
| 258 | 
            -
              if base_dt < dt
         | 
| 259 | 
            -
                base_dt = dt
         | 
| 260 | 
            -
                base_name = 'MessagePack'
         | 
| 261 | 
            -
              end
         | 
| 262 | 
            -
              parse_results[:msgpack] = dt
         | 
| 263 | 
            -
              puts "%d Msgpack()s in %0.3f seconds or %0.1f unpacks/msec" % [$iter, dt, $iter/dt/1000.0]
         | 
| 264 | 
            -
            rescue Exception => e
         | 
| 265 | 
            -
              parse_results[:msgpack] = 0.0
         | 
| 266 | 
            -
              puts "MessagePack failed: #{e.class}: #{e.message}"
         | 
| 267 | 
            -
            end
         | 
| 268 | 
            -
             | 
| 269 | 
            -
            start = Time.now
         | 
| 270 | 
            -
            $iter.times do
         | 
| 271 | 
            -
              Ox.dump(obj)
         | 
| 272 | 
            -
            end
         | 
| 273 | 
            -
            dt = Time.now - start
         | 
| 274 | 
            -
            parse_results[:ox] = dt
         | 
| 275 | 
            -
            puts "%d Ox.dump()s in %0.3f seconds or %0.1f dumps/msec" % [$iter, dt, $iter/dt/1000.0]
         | 
| 276 | 
            -
             | 
| 277 | 
            -
            puts "Parser results:"
         | 
| 278 | 
            -
            puts "gem       seconds  dumps/msec  X faster than #{base_name} (higher is better)"
         | 
| 279 | 
            -
            parse_results.each do |name,dt|
         | 
| 280 | 
            -
              if 0.0 == dt
         | 
| 281 | 
            -
                puts "#{name} failed to generate JSON"
         | 
| 282 | 
            -
                next
         | 
| 283 | 
            -
              end
         | 
| 284 | 
            -
              puts "%-7s  %6.3f    %5.1f       %4.1f" % [name, dt, $iter/dt/1000.0, base_dt/dt]
         | 
| 285 | 
            -
            end
         | 
| 286 | 
            -
             | 
| 287 | 
            -
            puts
         | 
    
        data/test/perf_strict.rb
    DELETED
    
    | @@ -1,127 +0,0 @@ | |
| 1 | 
            -
            #!/usr/bin/env ruby -wW1
         | 
| 2 | 
            -
            # encoding: UTF-8
         | 
| 3 | 
            -
             | 
| 4 | 
            -
            $: << '.'
         | 
| 5 | 
            -
            $: << File.join(File.dirname(__FILE__), "../lib")
         | 
| 6 | 
            -
            $: << File.join(File.dirname(__FILE__), "../ext")
         | 
| 7 | 
            -
             | 
| 8 | 
            -
            require 'optparse'
         | 
| 9 | 
            -
            require 'perf'
         | 
| 10 | 
            -
            require 'oj'
         | 
| 11 | 
            -
             | 
| 12 | 
            -
            $verbose = false
         | 
| 13 | 
            -
            $indent = 0
         | 
| 14 | 
            -
            $iter = 20000
         | 
| 15 | 
            -
            $with_bignum = false
         | 
| 16 | 
            -
            $with_nums = true
         | 
| 17 | 
            -
            $size = 0
         | 
| 18 | 
            -
             | 
| 19 | 
            -
            opts = OptionParser.new
         | 
| 20 | 
            -
            opts.on("-v", "verbose")                                    { $verbose = true }
         | 
| 21 | 
            -
            opts.on("-c", "--count [Int]", Integer, "iterations")       { |i| $iter = i }
         | 
| 22 | 
            -
            opts.on("-i", "--indent [Int]", Integer, "indentation")     { |i| $indent = i }
         | 
| 23 | 
            -
            opts.on("-s", "--size [Int]", Integer, "size (~Kbytes)")    { |i| $size = i }
         | 
| 24 | 
            -
            opts.on("-b", "with bignum")                                { $with_bignum = true }
         | 
| 25 | 
            -
            opts.on("-n", "without numbers")                            { $with_nums = false }
         | 
| 26 | 
            -
            opts.on("-h", "--help", "Show this display")                { puts opts; Process.exit!(0) }
         | 
| 27 | 
            -
            files = opts.parse(ARGV)
         | 
| 28 | 
            -
             | 
| 29 | 
            -
            if $with_nums
         | 
| 30 | 
            -
              $obj = {
         | 
| 31 | 
            -
                'a' => 'Alpha', # string
         | 
| 32 | 
            -
                'b' => true,    # boolean
         | 
| 33 | 
            -
                'c' => 12345,   # number
         | 
| 34 | 
            -
                'd' => [ true, [false, [-123456789, nil], 3.9676, ['Something else.', false], nil]], # mix it up array
         | 
| 35 | 
            -
                'e' => { 'zero' => nil, 'one' => 1, 'two' => 2, 'three' => [3], 'four' => [0, 1, 2, 3, 4] }, # hash
         | 
| 36 | 
            -
                'f' => nil,     # nil
         | 
| 37 | 
            -
                'h' => { 'a' => { 'b' => { 'c' => { 'd' => {'e' => { 'f' => { 'g' => nil }}}}}}}, # deep hash, not that deep
         | 
| 38 | 
            -
                'i' => [[[[[[[nil]]]]]]]  # deep array, again, not that deep
         | 
| 39 | 
            -
              }
         | 
| 40 | 
            -
              $obj['g'] = 12345678901234567890123456789 if $with_bignum
         | 
| 41 | 
            -
            else
         | 
| 42 | 
            -
              $obj = {
         | 
| 43 | 
            -
                'a' => 'Alpha',
         | 
| 44 | 
            -
                'b' => true,
         | 
| 45 | 
            -
                'c' => '12345',
         | 
| 46 | 
            -
                'd' => [ true, [false, ['12345', nil], '3.967', ['something', false], nil]],
         | 
| 47 | 
            -
                'e' => { 'zero' => '0', 'one' => '1', 'two' => '2' },
         | 
| 48 | 
            -
                'f' => nil,
         | 
| 49 | 
            -
                'h' => { 'a' => { 'b' => { 'c' => { 'd' => {'e' => { 'f' => { 'g' => nil }}}}}}}, # deep hash, not that deep
         | 
| 50 | 
            -
                'i' => [[[[[[[nil]]]]]]]  # deep array, again, not that deep
         | 
| 51 | 
            -
              }
         | 
| 52 | 
            -
            end
         | 
| 53 | 
            -
             | 
| 54 | 
            -
            Oj.default_options = { :indent => $indent, :mode => :strict }
         | 
| 55 | 
            -
             | 
| 56 | 
            -
            if 0 < $size
         | 
| 57 | 
            -
              o = $obj
         | 
| 58 | 
            -
              $obj = []
         | 
| 59 | 
            -
              (4 * $size).times do
         | 
| 60 | 
            -
                $obj << o
         | 
| 61 | 
            -
              end
         | 
| 62 | 
            -
            end
         | 
| 63 | 
            -
             | 
| 64 | 
            -
            $json = Oj.dump($obj)
         | 
| 65 | 
            -
            $obj_json = Oj.dump($obj, :mode => :object)
         | 
| 66 | 
            -
            #puts "*** size: #{$obj_json.size}"
         | 
| 67 | 
            -
            $failed = {} # key is same as String used in tests later
         | 
| 68 | 
            -
             | 
| 69 | 
            -
            def capture_error(tag, orig, load_key, dump_key, &blk)
         | 
| 70 | 
            -
              begin
         | 
| 71 | 
            -
                obj = blk.call(orig)
         | 
| 72 | 
            -
                raise "#{tag} #{dump_key} and #{load_key} did not return the same object as the original." unless orig == obj
         | 
| 73 | 
            -
              rescue Exception => e
         | 
| 74 | 
            -
                $failed[tag] = "#{e.class}: #{e.message}"
         | 
| 75 | 
            -
              end
         | 
| 76 | 
            -
            end
         | 
| 77 | 
            -
             | 
| 78 | 
            -
            # Verify that all packages dump and load correctly and return the same Object as the original.
         | 
| 79 | 
            -
            capture_error('Oj:strict', $obj, 'load', 'dump') { |o| Oj.strict_load(Oj.dump(o, :mode => :strict)) }
         | 
| 80 | 
            -
            capture_error('Yajl', $obj, 'encode', 'parse') { |o| require 'yajl'; Yajl::Parser.parse(Yajl::Encoder.encode(o)) }
         | 
| 81 | 
            -
            capture_error('JSON::Ext', $obj, 'generate', 'parse') { |o|
         | 
| 82 | 
            -
              require 'json'
         | 
| 83 | 
            -
              require 'json/ext'
         | 
| 84 | 
            -
              JSON.generator = JSON::Ext::Generator
         | 
| 85 | 
            -
              JSON.parser = JSON::Ext::Parser
         | 
| 86 | 
            -
              JSON.parse(JSON.generate(o))
         | 
| 87 | 
            -
            }
         | 
| 88 | 
            -
            capture_error('JSON::Pure', $obj, 'generate', 'parse') { |o|
         | 
| 89 | 
            -
              require 'json/pure'
         | 
| 90 | 
            -
              JSON.generator = JSON::Pure::Generator
         | 
| 91 | 
            -
              JSON.parser = JSON::Pure::Parser
         | 
| 92 | 
            -
              JSON.parse(JSON.generate(o))
         | 
| 93 | 
            -
            }
         | 
| 94 | 
            -
             | 
| 95 | 
            -
            if $verbose
         | 
| 96 | 
            -
              puts "json:\n#{$json}\n"
         | 
| 97 | 
            -
              puts "object json:\n#{$obj_json}\n"
         | 
| 98 | 
            -
              puts "Oj loaded object:\n#{Oj.strict_load($json)}\n"
         | 
| 99 | 
            -
              puts "Yajl loaded object:\n#{Yajl::Parser.parse($json)}\n"
         | 
| 100 | 
            -
              puts "JSON loaded object:\n#{JSON::Ext::Parser.new($json).parse}\n"
         | 
| 101 | 
            -
            end
         | 
| 102 | 
            -
             | 
| 103 | 
            -
            puts '-' * 80
         | 
| 104 | 
            -
            puts "Strict Parse Performance"
         | 
| 105 | 
            -
            perf = Perf.new()
         | 
| 106 | 
            -
            unless $failed.has_key?('JSON::Ext')
         | 
| 107 | 
            -
              perf.add('JSON::Ext', 'parse') { JSON.parse($json) }
         | 
| 108 | 
            -
              perf.before('JSON::Ext') { JSON.parser = JSON::Ext::Parser }
         | 
| 109 | 
            -
            end
         | 
| 110 | 
            -
            unless $failed.has_key?('JSON::Pure')
         | 
| 111 | 
            -
              perf.add('JSON::Pure', 'parse') { JSON.parse($json) }
         | 
| 112 | 
            -
              perf.before('JSON::Pure') { JSON.parser = JSON::Pure::Parser }
         | 
| 113 | 
            -
            end
         | 
| 114 | 
            -
            unless $failed.has_key?('Oj:strict')
         | 
| 115 | 
            -
              perf.add('Oj:strict', 'strict_load') { Oj.strict_load($json) }
         | 
| 116 | 
            -
            end
         | 
| 117 | 
            -
            perf.add('Yajl', 'parse') { Yajl::Parser.parse($json) } unless $failed.has_key?('Yajl')
         | 
| 118 | 
            -
            perf.run($iter)
         | 
| 119 | 
            -
             | 
| 120 | 
            -
            puts
         | 
| 121 | 
            -
            puts '-' * 80
         | 
| 122 | 
            -
            puts
         | 
| 123 | 
            -
             | 
| 124 | 
            -
            unless $failed.empty?
         | 
| 125 | 
            -
              puts "The following packages were not included for the reason listed"
         | 
| 126 | 
            -
              $failed.each { |tag,msg| puts "***** #{tag}: #{msg}" }
         | 
| 127 | 
            -
            end
         |