oj 3.14.3 → 3.15.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/ext/oj/custom.c +5 -15
- data/ext/oj/dump.c +27 -2
- data/ext/oj/mimic_json.c +21 -0
- data/ext/oj/object.c +7 -21
- data/ext/oj/oj.c +20 -0
- data/ext/oj/oj.h +3 -0
- data/ext/oj/strict.c +9 -27
- data/ext/oj/wab.c +9 -27
- data/lib/oj/version.rb +1 -1
- data/lib/oj.rb +3 -0
- data/pages/Options.md +4 -0
- data/test/_test_active.rb +8 -8
- data/test/_test_active_mimic.rb +7 -7
- data/test/_test_mimic_rails.rb +17 -19
- data/test/files.rb +14 -14
- data/test/foo.rb +5 -5
- data/test/helper.rb +4 -4
- data/test/mem.rb +8 -7
- data/test/perf.rb +21 -26
- data/test/perf_compat.rb +30 -32
- data/test/perf_dump.rb +25 -25
- data/test/perf_fast.rb +80 -82
- data/test/perf_file.rb +27 -29
- data/test/perf_object.rb +65 -68
- data/test/perf_once.rb +8 -7
- data/test/perf_parser.rb +40 -46
- data/test/perf_saj.rb +46 -53
- data/test/perf_scp.rb +57 -69
- data/test/perf_simple.rb +40 -38
- data/test/perf_strict.rb +68 -70
- data/test/perf_wab.rb +67 -69
- data/test/prec.rb +3 -3
- data/test/sample.rb +16 -15
- data/test/sample_json.rb +8 -7
- data/test/test_compat.rb +44 -46
- data/test/test_custom.rb +56 -42
- data/test/test_debian.rb +6 -9
- data/test/test_fast.rb +78 -72
- data/test/test_file.rb +16 -21
- data/test/test_gc.rb +5 -5
- data/test/test_generate.rb +5 -5
- data/test/test_hash.rb +4 -4
- data/test/test_integer_range.rb +9 -9
- data/test/test_null.rb +18 -20
- data/test/test_object.rb +76 -86
- data/test/test_parser.rb +4 -4
- data/test/test_parser_debug.rb +4 -4
- data/test/test_parser_saj.rb +31 -31
- data/test/test_parser_usual.rb +3 -3
- data/test/test_rails.rb +2 -2
- data/test/test_saj.rb +8 -8
- data/test/test_scp.rb +29 -29
- data/test/test_strict.rb +25 -31
- data/test/test_various.rb +121 -75
- data/test/test_wab.rb +43 -42
- data/test/test_writer.rb +46 -46
- data/test/tests.rb +7 -7
- data/test/tests_mimic.rb +6 -6
- data/test/tests_mimic_addition.rb +6 -6
- metadata +3 -6
- data/test/bar.rb +0 -11
- data/test/baz.rb +0 -16
- data/test/bug.rb +0 -16
- data/test/zoo.rb +0 -13
data/test/_test_mimic_rails.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
4
|
+
$LOAD_PATH << __dir__
|
5
5
|
|
6
6
|
require 'helper'
|
7
|
-
#Oj.mimic_JSON
|
7
|
+
# Oj.mimic_JSON
|
8
8
|
require 'rails/all'
|
9
9
|
|
10
10
|
require 'active_model'
|
@@ -36,14 +36,12 @@ end
|
|
36
36
|
class MimicRails < Minitest::Test
|
37
37
|
|
38
38
|
def test_mimic_exception
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
assert(false, 'Expected a JSON::ParserError')
|
46
|
-
end
|
39
|
+
ActiveSupport::JSON.decode('{')
|
40
|
+
puts 'Failed'
|
41
|
+
rescue ActiveSupport::JSON.parse_error
|
42
|
+
assert(true)
|
43
|
+
rescue Exception
|
44
|
+
assert(false, 'Expected a JSON::ParserError')
|
47
45
|
end
|
48
46
|
|
49
47
|
def test_dump_string
|
@@ -84,11 +82,11 @@ class MimicRails < Minitest::Test
|
|
84
82
|
category = Category.new(1, 'test')
|
85
83
|
serializer = CategorySerializer.new(category)
|
86
84
|
|
87
|
-
|
85
|
+
serializer.to_json()
|
88
86
|
puts "*** serializer.to_json() #{serializer.to_json()}"
|
89
|
-
|
87
|
+
serializer.as_json()
|
90
88
|
puts "*** serializer.as_json() #{serializer.as_json()}"
|
91
|
-
|
89
|
+
JSON.dump(serializer)
|
92
90
|
puts "*** JSON.dump(serializer) #{JSON.dump(serializer)}"
|
93
91
|
|
94
92
|
puts "*** category.to_json() #{category.to_json()}"
|
@@ -103,7 +101,7 @@ class MimicRails < Minitest::Test
|
|
103
101
|
cat2 = Category.new(2, 'test')
|
104
102
|
a = Array.wrap([cat1, cat2])
|
105
103
|
|
106
|
-
#serializer = CategorySerializer.new(a)
|
104
|
+
# serializer = CategorySerializer.new(a)
|
107
105
|
|
108
106
|
puts "*** a.to_json() #{a.to_json()}"
|
109
107
|
puts "*** a.as_json() #{a.as_json()}"
|
@@ -113,13 +111,13 @@ class MimicRails < Minitest::Test
|
|
113
111
|
|
114
112
|
def test_dump_time
|
115
113
|
Oj.default_options= {:indent => 2}
|
116
|
-
now = ActiveSupport::TimeZone['America/Chicago'].parse(
|
114
|
+
now = ActiveSupport::TimeZone['America/Chicago'].parse('2014-11-01 13:20:47')
|
117
115
|
json = Oj.dump(now, mode: :object, time_format: :xmlschema)
|
118
|
-
#puts "*** json: #{json}"
|
116
|
+
# puts "*** json: #{json}"
|
119
117
|
|
120
118
|
oj_dump = Oj.load(json, mode: :object, time_format: :xmlschema)
|
121
|
-
#puts "Now: #{now}\n Oj: #{oj_dump}"
|
122
|
-
assert_equal(
|
119
|
+
# puts "Now: #{now}\n Oj: #{oj_dump}"
|
120
|
+
assert_equal('2014-11-01T13:20:47-05:00', oj_dump.xmlschema)
|
123
121
|
end
|
124
122
|
|
125
123
|
end # MimicRails
|
data/test/files.rb
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
#!/usr/bin/env ruby -wW2
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
if $
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
if $PROGRAM_NAME == __FILE__
|
5
|
+
$LOAD_PATH << '.'
|
6
|
+
$LOAD_PATH << '..'
|
7
|
+
$LOAD_PATH << '../lib'
|
8
|
+
$LOAD_PATH << '../ext'
|
8
9
|
end
|
9
10
|
|
10
11
|
require 'sample/file'
|
11
12
|
require 'sample/dir'
|
12
13
|
|
13
14
|
def files(dir)
|
14
|
-
d =
|
15
|
+
d = Sample::Dir.new(dir)
|
15
16
|
Dir.new(dir).each do |fn|
|
16
17
|
next if fn.start_with?('.')
|
17
18
|
|
18
19
|
filename = File.join(dir, fn)
|
19
|
-
#filename = '.' == dir ? fn : File.join(dir, fn)
|
20
|
-
if File.directory?(filename)
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
20
|
+
# filename = '.' == dir ? fn : File.join(dir, fn)
|
21
|
+
d << if File.directory?(filename)
|
22
|
+
files(filename)
|
23
|
+
else
|
24
|
+
Sample::File.new(filename)
|
25
|
+
end
|
25
26
|
end
|
26
|
-
#pp d
|
27
|
+
# pp d
|
27
28
|
d
|
28
29
|
end
|
29
|
-
|
data/test/foo.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
|
4
|
+
$LOAD_PATH << '.'
|
5
|
+
$LOAD_PATH << File.join(__dir__, '../lib')
|
6
|
+
$LOAD_PATH << File.join(__dir__, '../ext')
|
6
7
|
|
7
|
-
require
|
8
|
+
require 'oj'
|
8
9
|
|
9
10
|
GC.stress = true
|
10
11
|
|
11
|
-
require "oj"
|
12
12
|
Oj.mimic_JSON
|
13
13
|
|
14
14
|
Oj.add_to_json(Hash)
|
data/test/helper.rb
CHANGED
@@ -20,8 +20,8 @@ require 'oj'
|
|
20
20
|
def verify_gc_compaction
|
21
21
|
# This method was added in Ruby 3.0.0. Calling it this way asks the GC to
|
22
22
|
# move objects around, helping to find object movement bugs.
|
23
|
-
if defined?(GC.verify_compaction_references) == 'method' &&
|
24
|
-
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new(
|
23
|
+
if defined?(GC.verify_compaction_references) == 'method' && RbConfig::CONFIG['host_os'] !~ /(mingw|mswin)/
|
24
|
+
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.2.0')
|
25
25
|
GC.verify_compaction_references(expand_heap: true, toward: :empty)
|
26
26
|
else
|
27
27
|
GC.verify_compaction_references(double_heap: true, toward: :empty)
|
@@ -33,7 +33,7 @@ $ruby = RUBY_DESCRIPTION.split(' ')[0]
|
|
33
33
|
$ruby = 'ree' if 'ruby' == $ruby && RUBY_DESCRIPTION.include?('Ruby Enterprise Edition')
|
34
34
|
|
35
35
|
class Range
|
36
|
-
def to_hash
|
37
|
-
{ 'begin' => self.begin, 'end' => self.end, 'exclude_end' =>
|
36
|
+
def to_hash
|
37
|
+
{ 'begin' => self.begin, 'end' => self.end, 'exclude_end' => exclude_end? }
|
38
38
|
end
|
39
39
|
end
|
data/test/mem.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
require 'English'
|
5
|
+
$LOAD_PATH << '.'
|
6
|
+
$LOAD_PATH << File.join(__dir__, '../lib')
|
7
|
+
$LOAD_PATH << File.join(__dir__, '../ext')
|
7
8
|
|
8
9
|
require 'oj'
|
9
10
|
|
10
11
|
Oj.default_options = { mode: :rails, cache_keys: false, cache_str: -1 }
|
11
12
|
|
12
13
|
def mem
|
13
|
-
`ps -o rss= -p #{
|
14
|
+
`ps -o rss= -p #{$PROCESS_ID}`.to_i
|
14
15
|
end
|
15
16
|
|
16
17
|
('a'..'z').each { |a|
|
@@ -20,8 +21,8 @@ end
|
|
20
21
|
('a'..'z').each { |e|
|
21
22
|
('a'..'z').each { |f|
|
22
23
|
key = "#{a}#{b}#{c}#{d}#{e}#{f}"
|
23
|
-
|
24
|
-
#Oj.dump(x)
|
24
|
+
Oj.load(%|{ "#{key}": 101}|)
|
25
|
+
# Oj.dump(x)
|
25
26
|
}
|
26
27
|
}
|
27
28
|
}
|
data/test/perf.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
class Perf
|
2
4
|
|
3
|
-
def initialize
|
5
|
+
def initialize
|
4
6
|
@items = []
|
5
7
|
end
|
6
8
|
|
@@ -18,7 +20,7 @@ class Perf
|
|
18
20
|
end
|
19
21
|
|
20
22
|
def run(iter)
|
21
|
-
base = Item.new(nil, nil) {
|
23
|
+
base = Item.new(nil, nil) {}
|
22
24
|
base.run(iter, 0.0)
|
23
25
|
@items.each do |i|
|
24
26
|
i.run(iter, base.duration)
|
@@ -31,9 +33,7 @@ class Perf
|
|
31
33
|
summary()
|
32
34
|
end
|
33
35
|
|
34
|
-
def summary
|
35
|
-
fastest = nil
|
36
|
-
slowest = nil
|
36
|
+
def summary
|
37
37
|
width = 6
|
38
38
|
@items.each do |i|
|
39
39
|
next if i.duration.nil?
|
@@ -44,23 +44,20 @@ class Perf
|
|
44
44
|
iva.delete_if { |i| i.duration.nil? }
|
45
45
|
iva = iva.sort_by { |i| i.duration }
|
46
46
|
puts
|
47
|
-
puts
|
48
|
-
puts
|
47
|
+
puts 'Summary:'
|
48
|
+
puts '%*s time (secs) rate (ops/sec)' % [width, 'System']
|
49
49
|
puts "#{'-' * width} ----------- --------------"
|
50
50
|
iva.each do |i|
|
51
|
-
|
52
|
-
else
|
53
|
-
puts "%*s %11.3f %14.3f" % [width, i.title, i.duration, i.rate ]
|
54
|
-
end
|
51
|
+
puts '%*s %11.3f %14.3f' % [width, i.title, i.duration, i.rate ] unless i.duration.nil?
|
55
52
|
end
|
56
53
|
puts
|
57
54
|
puts "Comparison Matrix\n(performance factor, 2.0 means row is twice as fast as column)"
|
58
|
-
puts ([' ' * width] + iva.map { |i|
|
59
|
-
puts (['-' * width] + iva.map { |
|
55
|
+
puts ([' ' * width] + iva.map { |i| '%*s' % [width, i.title] }).join(' ')
|
56
|
+
puts (['-' * width] + iva.map { |_i| '-' * width }).join(' ')
|
60
57
|
iva.each do |i|
|
61
|
-
line = [
|
58
|
+
line = ['%*s' % [width, i.title]]
|
62
59
|
iva.each do |o|
|
63
|
-
line << (
|
60
|
+
line << ('%*.2f' % [width, o.duration / i.duration])
|
64
61
|
end
|
65
62
|
puts line.join(' ')
|
66
63
|
end
|
@@ -90,17 +87,15 @@ class Perf
|
|
90
87
|
end
|
91
88
|
|
92
89
|
def run(iter, base)
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
@error = "#{e.class}: #{e.message}"
|
103
|
-
end
|
90
|
+
GC.start
|
91
|
+
@before.call unless @before.nil?
|
92
|
+
start = Time.now
|
93
|
+
iter.times { @blk.call }
|
94
|
+
@duration = Time.now - start - base
|
95
|
+
@duration = 0.0 if @duration < 0.0
|
96
|
+
@rate = iter / @duration
|
97
|
+
rescue Exception => e
|
98
|
+
@error = "#{e.class}: #{e.message}"
|
104
99
|
end
|
105
100
|
|
106
101
|
end # Item
|
data/test/perf_compat.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
$LOAD_PATH << '.'
|
5
|
+
$LOAD_PATH << File.join(__dir__, '../lib')
|
6
|
+
$LOAD_PATH << File.join(__dir__, '../ext')
|
7
7
|
|
8
8
|
require 'optparse'
|
9
9
|
require 'perf'
|
@@ -11,25 +11,23 @@ require 'oj'
|
|
11
11
|
|
12
12
|
$verbose = false
|
13
13
|
$indent = 0
|
14
|
-
$iter =
|
14
|
+
$iter = 20_000
|
15
15
|
$size = 0
|
16
16
|
|
17
17
|
opts = OptionParser.new
|
18
|
-
opts.on(
|
19
|
-
opts.on(
|
20
|
-
opts.on(
|
21
|
-
opts.on(
|
22
|
-
opts.on(
|
23
|
-
|
18
|
+
opts.on('-v', 'verbose') { $verbose = true }
|
19
|
+
opts.on('-c', '--count [Int]', Integer, 'iterations') { |i| $iter = i }
|
20
|
+
opts.on('-i', '--indent [Int]', Integer, 'indentation') { |i| $indent = i }
|
21
|
+
opts.on('-s', '--size [Int]', Integer, 'size (~Kbytes)') { |i| $size = i }
|
22
|
+
opts.on('-h', '--help', 'Show this display') { puts opts; Process.exit!(0) }
|
23
|
+
opts.parse(ARGV)
|
24
24
|
|
25
25
|
def capture_error(tag, orig, load_key, dump_key, &blk)
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
$failed[tag] = "#{e.class}: #{e.message}"
|
32
|
-
end
|
26
|
+
obj = blk.call(orig)
|
27
|
+
puts obj unless orig == obj
|
28
|
+
raise "#{tag} #{dump_key} and #{load_key} did not return the same object as the original." unless orig == obj
|
29
|
+
rescue Exception => e
|
30
|
+
$failed[tag] = "#{e.class}: #{e.message}"
|
33
31
|
end
|
34
32
|
|
35
33
|
# Verify that all packages dump and load correctly and return the same Object as the original.
|
@@ -39,7 +37,7 @@ capture_error('JSON::Ext', $obj, 'generate', 'parse') { |o|
|
|
39
37
|
require 'json/ext'
|
40
38
|
JSON.generator = JSON::Ext::Generator
|
41
39
|
JSON.parser = JSON::Ext::Parser
|
42
|
-
JSON.
|
40
|
+
JSON.parse(JSON.generate(o))
|
43
41
|
}
|
44
42
|
|
45
43
|
module One
|
@@ -47,7 +45,7 @@ module One
|
|
47
45
|
module Three
|
48
46
|
class Empty
|
49
47
|
|
50
|
-
def initialize
|
48
|
+
def initialize
|
51
49
|
@a = 1
|
52
50
|
@b = 2
|
53
51
|
@c = 3
|
@@ -58,16 +56,16 @@ module One
|
|
58
56
|
end
|
59
57
|
alias == eql?
|
60
58
|
|
61
|
-
def as_json(*
|
59
|
+
def as_json(*_a)
|
62
60
|
{JSON.create_id => self.class.name, 'a' => @a, 'b' => @b, 'c' => @c }
|
63
61
|
end
|
64
|
-
|
65
|
-
def to_json(*
|
62
|
+
|
63
|
+
def to_json(*_a)
|
66
64
|
JSON.generate(as_json())
|
67
65
|
end
|
68
66
|
|
69
|
-
def self.json_create(
|
70
|
-
|
67
|
+
def self.json_create(_h)
|
68
|
+
new()
|
71
69
|
end
|
72
70
|
end # Empty
|
73
71
|
end # Three
|
@@ -77,8 +75,8 @@ end # One
|
|
77
75
|
$obj = {
|
78
76
|
'a' => 'Alpha', # string
|
79
77
|
'b' => true, # boolean
|
80
|
-
'c' =>
|
81
|
-
'd' => [ true, [false, [-
|
78
|
+
'c' => 12_345, # number
|
79
|
+
'd' => [ true, [false, [-123_456_789, nil], 3.9676, ['Something else.', false], nil]], # mix it up array
|
82
80
|
'e' => { 'zero' => nil, 'one' => 1, 'two' => 2, 'three' => [3], 'four' => [0, 1, 2, 3, 4] }, # hash
|
83
81
|
'f' => nil, # nil
|
84
82
|
'g' => One::Two::Three::Empty.new(),
|
@@ -109,13 +107,13 @@ if $verbose
|
|
109
107
|
end
|
110
108
|
|
111
109
|
puts '-' * 80
|
112
|
-
puts
|
110
|
+
puts 'Compat Parse Performance'
|
113
111
|
perf = Perf.new()
|
114
|
-
unless $failed.
|
115
|
-
perf.add('JSON::Ext', 'parse') { JSON.
|
112
|
+
unless $failed.key?('JSON::Ext')
|
113
|
+
perf.add('JSON::Ext', 'parse') { JSON.parse($json) }
|
116
114
|
perf.before('JSON::Ext') { JSON.parser = JSON::Ext::Parser }
|
117
115
|
end
|
118
|
-
unless $failed.
|
116
|
+
unless $failed.key?('Oj:compat')
|
119
117
|
perf.add('Oj:compat', 'compat_load') { Oj.compat_load($json) }
|
120
118
|
end
|
121
119
|
perf.run($iter)
|
@@ -125,6 +123,6 @@ puts '-' * 80
|
|
125
123
|
puts
|
126
124
|
|
127
125
|
unless $failed.empty?
|
128
|
-
puts
|
126
|
+
puts 'The following packages were not included for the reason listed'
|
129
127
|
$failed.each { |tag, msg| puts "***** #{tag}: #{msg}" }
|
130
128
|
end
|
data/test/perf_dump.rb
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
$LOAD_PATH << '.'
|
5
|
+
$LOAD_PATH << File.join(__dir__, '../lib')
|
6
|
+
$LOAD_PATH << File.join(__dir__, '../ext')
|
7
7
|
|
8
8
|
require 'optparse'
|
9
9
|
require 'oj'
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
@verbose = false
|
12
|
+
@indent = 2
|
13
|
+
@iter = 100_000
|
14
|
+
@size = 2
|
15
15
|
|
16
16
|
opts = OptionParser.new
|
17
|
-
opts.on(
|
18
|
-
opts.on(
|
19
|
-
opts.on(
|
20
|
-
opts.on(
|
21
|
-
opts.on(
|
22
|
-
|
23
|
-
|
24
|
-
|
17
|
+
opts.on('-v', 'verbose') { @verbose = true }
|
18
|
+
opts.on('-c', '--count [Int]', Integer, 'iterations') { |i| @iter = i }
|
19
|
+
opts.on('-i', '--indent [Int]', Integer, 'indentation') { |i| @indent = i }
|
20
|
+
opts.on('-s', '--size [Int]', Integer, 'size (~Kbytes)') { |i| @size = i }
|
21
|
+
opts.on('-h', '--help', 'Show this display') { puts opts; Process.exit!(0) }
|
22
|
+
opts.parse(ARGV)
|
23
|
+
|
24
|
+
@obj = {
|
25
25
|
'a' => 'Alpha', # string
|
26
26
|
'b' => true, # boolean
|
27
27
|
'c' => 12345, # number
|
@@ -32,19 +32,19 @@ $obj = {
|
|
32
32
|
'i' => [[[[[[[nil]]]]]]] # deep array, again, not that deep
|
33
33
|
}
|
34
34
|
|
35
|
-
Oj.default_options = { :indent =>
|
35
|
+
Oj.default_options = { :indent => @indent, :mode => :strict }
|
36
36
|
|
37
|
-
if 0 <
|
38
|
-
o =
|
39
|
-
|
40
|
-
(4 *
|
41
|
-
|
37
|
+
if 0 < @size
|
38
|
+
o = @obj
|
39
|
+
@obj = []
|
40
|
+
(4 * @size).times do
|
41
|
+
@obj << o
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
-
|
45
|
+
@json = Oj.dump(@obj)
|
46
46
|
GC.start
|
47
47
|
start = Time.now
|
48
|
-
|
48
|
+
@iter.times { Oj.dump(@obj) }
|
49
49
|
duration = Time.now - start
|
50
|
-
puts "Dumped #{
|
50
|
+
puts "Dumped #{@json.length} byte JSON #{@iter} times in %0.3f seconds or %0.3f iteration/sec." % [duration, @iter / duration]
|