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/perf_simple.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby -wW1
|
2
|
-
#
|
2
|
+
# frozen_string_literal: true
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
$LOAD_PATH << File.join(__dir__, '../lib')
|
5
|
+
$LOAD_PATH << File.join(__dir__, '../ext')
|
6
6
|
|
7
7
|
require 'optparse'
|
8
8
|
require 'yajl'
|
@@ -14,13 +14,14 @@ require 'oj'
|
|
14
14
|
require 'ox'
|
15
15
|
|
16
16
|
class Jazz
|
17
|
-
def initialize
|
17
|
+
def initialize
|
18
18
|
@boolean = true
|
19
19
|
@number = 58
|
20
|
-
@string =
|
20
|
+
@string = 'A string'
|
21
21
|
@array = [true, false, nil]
|
22
22
|
@hash = { 'one' => 1, 'two' => 2 }
|
23
23
|
end
|
24
|
+
|
24
25
|
def to_json(*_args)
|
25
26
|
%{
|
26
27
|
{ "boolean":#{@boolean},
|
@@ -31,7 +32,8 @@ class Jazz
|
|
31
32
|
}
|
32
33
|
}
|
33
34
|
end
|
34
|
-
|
35
|
+
|
36
|
+
def to_hash
|
35
37
|
{ 'boolean' => @boolean,
|
36
38
|
'number' => @number,
|
37
39
|
'string' => @string,
|
@@ -39,37 +41,38 @@ class Jazz
|
|
39
41
|
'hash' => @hash,
|
40
42
|
}
|
41
43
|
end
|
44
|
+
|
42
45
|
def to_msgpack(out='')
|
43
46
|
to_hash().to_msgpack(out)
|
44
47
|
end
|
45
48
|
end
|
46
49
|
|
47
50
|
$indent = 2
|
48
|
-
$iter =
|
51
|
+
$iter = 10_000
|
49
52
|
$with_object = true
|
50
53
|
$with_bignum = true
|
51
54
|
$with_nums = true
|
52
55
|
|
53
56
|
opts = OptionParser.new
|
54
|
-
opts.on(
|
55
|
-
opts.on(
|
56
|
-
opts.on(
|
57
|
-
opts.on(
|
58
|
-
opts.on(
|
59
|
-
opts.on(
|
60
|
-
|
57
|
+
opts.on('-c', '--count [Int]', Integer, 'iterations') { |i| $iter = i }
|
58
|
+
opts.on('-i', '--indent [Int]', Integer, 'indentation') { |i| $indent = i }
|
59
|
+
opts.on('-o', 'without objects') { $with_object = false }
|
60
|
+
opts.on('-b', 'without bignum') { $with_bignum = false }
|
61
|
+
opts.on('-n', 'without numbers') { $with_nums = false }
|
62
|
+
opts.on('-h', '--help', 'Show this display') { puts opts; Process.exit!(0) }
|
63
|
+
opts.parse(ARGV)
|
61
64
|
|
62
65
|
if $with_nums
|
63
66
|
obj = {
|
64
67
|
'a' => 'Alpha',
|
65
68
|
'b' => true,
|
66
|
-
'c' =>
|
67
|
-
'd' => [ true, [false, [
|
69
|
+
'c' => 12_345,
|
70
|
+
'd' => [ true, [false, [12_345, nil], 3.967, ['something', false], nil]],
|
68
71
|
'e' => { 'one' => 1, 'two' => 2 },
|
69
72
|
'f' => nil,
|
70
73
|
}
|
71
74
|
obj['g'] = Jazz.new() if $with_object
|
72
|
-
obj['h'] =
|
75
|
+
obj['h'] = 12_345_678_901_234_567_890_123_456_789 if $with_bignum
|
73
76
|
else
|
74
77
|
obj = {
|
75
78
|
'a' => 'Alpha',
|
@@ -102,7 +105,7 @@ end
|
|
102
105
|
dt = Time.now - start
|
103
106
|
base_dt = dt
|
104
107
|
parse_results[:oj] = dt
|
105
|
-
puts
|
108
|
+
puts '%d Oj.load()s in %0.3f seconds or %0.1f loads/msec' % [$iter, dt, $iter/dt/1000.0]
|
106
109
|
|
107
110
|
start = Time.now
|
108
111
|
$iter.times do
|
@@ -114,7 +117,7 @@ if base_dt < dt
|
|
114
117
|
base_name = 'Yajl'
|
115
118
|
end
|
116
119
|
parse_results[:yajl] = dt
|
117
|
-
puts
|
120
|
+
puts '%d Yajl::Parser.parse()s in %0.3f seconds or %0.1f parses/msec' % [$iter, dt, $iter/dt/1000.0]
|
118
121
|
|
119
122
|
begin
|
120
123
|
JSON.parser = JSON::Ext::Parser
|
@@ -128,7 +131,7 @@ begin
|
|
128
131
|
base_name = 'JSON::Ext'
|
129
132
|
end
|
130
133
|
parse_results[:ext] = dt
|
131
|
-
puts
|
134
|
+
puts '%d JSON::Ext::Parser parse()s in %0.3f seconds or %0.1f parses/msec' % [$iter, dt, $iter/dt/1000.0]
|
132
135
|
rescue Exception => e
|
133
136
|
puts "JSON::Ext failed: #{e.class}: #{e.message}"
|
134
137
|
end
|
@@ -145,7 +148,7 @@ begin
|
|
145
148
|
base_name = 'JSON::Pure'
|
146
149
|
end
|
147
150
|
parse_results[:pure] = dt
|
148
|
-
puts
|
151
|
+
puts '%d JSON::Pure::Parser parse()s in %0.3f seconds or %0.1f parses/msec' % [$iter, dt, $iter/dt/1000.0]
|
149
152
|
rescue Exception => e
|
150
153
|
puts "JSON::Pure failed: #{e.class}: #{e.message}"
|
151
154
|
end
|
@@ -162,7 +165,7 @@ begin
|
|
162
165
|
base_name = 'MessagePack'
|
163
166
|
end
|
164
167
|
parse_results[:msgpack] = dt
|
165
|
-
puts
|
168
|
+
puts '%d MessagePack.unpack()s in %0.3f seconds or %0.1f packs/msec' % [$iter, dt, $iter/dt/1000.0]
|
166
169
|
rescue Exception => e
|
167
170
|
puts "MessagePack failed: #{e.class}: #{e.message}"
|
168
171
|
end
|
@@ -173,23 +176,22 @@ $iter.times do
|
|
173
176
|
end
|
174
177
|
dt = Time.now - start
|
175
178
|
parse_results[:ox] = dt
|
176
|
-
puts
|
179
|
+
puts '%d Ox.load()s in %0.3f seconds or %0.1f loads/msec' % [$iter, dt, $iter/dt/1000.0]
|
177
180
|
|
178
|
-
puts
|
181
|
+
puts 'Parser results:'
|
179
182
|
puts "gem seconds parses/msec X faster than #{base_name} (higher is better)"
|
180
|
-
parse_results.each do |name,
|
181
|
-
if 0.0
|
183
|
+
parse_results.each do |name, dt2|
|
184
|
+
if dt2 <= 0.0
|
182
185
|
puts "#{name} failed to generate JSON"
|
183
186
|
next
|
184
187
|
end
|
185
|
-
puts
|
188
|
+
puts '%-7s %6.3f %5.1f %4.1f' % [name, dt2, $iter/dt/1000.0, base_dt/dt2]
|
186
189
|
end
|
187
190
|
|
188
191
|
puts
|
189
192
|
|
190
193
|
# Back to object mode for best performance when dumping.
|
191
194
|
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
195
|
|
194
196
|
start = Time.now
|
195
197
|
$iter.times do
|
@@ -199,7 +201,7 @@ dt = Time.now - start
|
|
199
201
|
base_dt = dt
|
200
202
|
base_name = 'Oj'
|
201
203
|
parse_results[:oj] = dt
|
202
|
-
puts
|
204
|
+
puts '%d Oj.dump()s in %0.3f seconds or %0.1f dumps/msec' % [$iter, dt, $iter/dt/1000.0]
|
203
205
|
|
204
206
|
start = Time.now
|
205
207
|
$iter.times do
|
@@ -211,7 +213,7 @@ if base_dt < dt
|
|
211
213
|
base_name = 'Yajl'
|
212
214
|
end
|
213
215
|
parse_results[:yajl] = dt
|
214
|
-
puts
|
216
|
+
puts '%d Yajl::Encoder.encode()s in %0.3f seconds or %0.1f encodes/msec' % [$iter, dt, $iter/dt/1000.0]
|
215
217
|
|
216
218
|
begin
|
217
219
|
JSON.parser = JSON::Ext::Parser
|
@@ -225,7 +227,7 @@ begin
|
|
225
227
|
base_name = 'JSON::Ext'
|
226
228
|
end
|
227
229
|
parse_results[:pure] = dt
|
228
|
-
puts
|
230
|
+
puts '%d JSON::Ext generate()s in %0.3f seconds or %0.1f generates/msec' % [$iter, dt, $iter/dt/1000.0]
|
229
231
|
rescue Exception => e
|
230
232
|
parse_results[:ext] = 0.0
|
231
233
|
puts "JSON::Ext failed: #{e.class}: #{e.message}"
|
@@ -243,7 +245,7 @@ begin
|
|
243
245
|
base_name = 'JSON::Pure'
|
244
246
|
end
|
245
247
|
parse_results[:pure] = dt
|
246
|
-
puts
|
248
|
+
puts '%d JSON::Pure generate()s in %0.3f seconds or %0.1f generates/msec' % [$iter, dt, $iter/dt/1000.0]
|
247
249
|
rescue Exception => e
|
248
250
|
parse_results[:pure] = 0.0
|
249
251
|
puts "JSON::Pure failed: #{e.class}: #{e.message}"
|
@@ -260,7 +262,7 @@ begin
|
|
260
262
|
base_name = 'MessagePack'
|
261
263
|
end
|
262
264
|
parse_results[:msgpack] = dt
|
263
|
-
puts
|
265
|
+
puts '%d Msgpack()s in %0.3f seconds or %0.1f unpacks/msec' % [$iter, dt, $iter/dt/1000.0]
|
264
266
|
rescue Exception => e
|
265
267
|
parse_results[:msgpack] = 0.0
|
266
268
|
puts "MessagePack failed: #{e.class}: #{e.message}"
|
@@ -272,16 +274,16 @@ $iter.times do
|
|
272
274
|
end
|
273
275
|
dt = Time.now - start
|
274
276
|
parse_results[:ox] = dt
|
275
|
-
puts
|
277
|
+
puts '%d Ox.dump()s in %0.3f seconds or %0.1f dumps/msec' % [$iter, dt, $iter/dt/1000.0]
|
276
278
|
|
277
|
-
puts
|
279
|
+
puts 'Parser results:'
|
278
280
|
puts "gem seconds dumps/msec X faster than #{base_name} (higher is better)"
|
279
|
-
parse_results.each do |name,
|
280
|
-
if 0.0
|
281
|
+
parse_results.each do |name, dt2|
|
282
|
+
if dt2 <= 0.0
|
281
283
|
puts "#{name} failed to generate JSON"
|
282
284
|
next
|
283
285
|
end
|
284
|
-
puts
|
286
|
+
puts '%-7s %6.3f %5.1f %4.1f' % [name, dt2, $iter/dt/1000.0, base_dt/dt2]
|
285
287
|
end
|
286
288
|
|
287
289
|
puts
|
data/test/perf_strict.rb
CHANGED
@@ -1,49 +1,49 @@
|
|
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'
|
10
10
|
require 'oj'
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
12
|
+
@verbose = false
|
13
|
+
@indent = 0
|
14
|
+
@iter = 20_000
|
15
|
+
@with_bignum = false
|
16
|
+
@with_nums = true
|
17
|
+
@size = 0
|
18
|
+
@symbolize = false
|
19
|
+
@cache_keys = true
|
20
20
|
|
21
21
|
opts = OptionParser.new
|
22
|
-
opts.on(
|
23
|
-
opts.on(
|
24
|
-
opts.on(
|
25
|
-
opts.on(
|
26
|
-
opts.on(
|
27
|
-
opts.on(
|
28
|
-
opts.on(
|
29
|
-
opts.on(
|
30
|
-
opts.on(
|
31
|
-
|
32
|
-
|
33
|
-
if
|
34
|
-
|
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('-n', 'without numbers') { @with_nums = false }
|
28
|
+
opts.on('-z', '--symbolize', 'symbolize keys') { @symbolize = true }
|
29
|
+
opts.on('-k', '--no-cache', 'turn off key caching') { @cache_keys = false }
|
30
|
+
opts.on('-h', '--help', 'Show this display') { puts opts; Process.exit!(0) }
|
31
|
+
opts.parse(ARGV)
|
32
|
+
|
33
|
+
if @with_nums
|
34
|
+
@obj = {
|
35
35
|
'a' => 'Alpha', # string
|
36
36
|
'b' => true, # boolean
|
37
|
-
'c' =>
|
38
|
-
'd' => [ true, [false, [-
|
37
|
+
'c' => 12_345, # number
|
38
|
+
'd' => [ true, [false, [-123_456_789, nil], 3.9676, ['Something else.', false], nil]], # mix it up array
|
39
39
|
'e' => { 'zero' => nil, 'one' => 1, 'two' => 2, 'three' => [3], 'four' => [0, 1, 2, 3, 4] }, # hash
|
40
40
|
'f' => nil, # nil
|
41
41
|
'h' => { 'a' => { 'b' => { 'c' => { 'd' => {'e' => { 'f' => { 'g' => nil }}}}}}}, # deep hash, not that deep
|
42
42
|
'i' => [[[[[[[nil]]]]]]] # deep array, again, not that deep
|
43
43
|
}
|
44
|
-
|
44
|
+
@obj['g'] = 12_345_678_901_234_567_890_123_456_789 if @with_bignum
|
45
45
|
else
|
46
|
-
|
46
|
+
@obj = {
|
47
47
|
'a' => 'Alpha',
|
48
48
|
'b' => true,
|
49
49
|
'c' => '12345',
|
@@ -55,37 +55,35 @@ else
|
|
55
55
|
}
|
56
56
|
end
|
57
57
|
|
58
|
-
Oj.default_options = { :indent =>
|
58
|
+
Oj.default_options = { :indent => @indent, :mode => :strict, cache_keys: @cache_keys, cache_str: 5 }
|
59
59
|
|
60
|
-
if 0 <
|
61
|
-
|
62
|
-
|
63
|
-
(4 *
|
64
|
-
|
60
|
+
if 0 < @size
|
61
|
+
ob = @obj
|
62
|
+
@obj = []
|
63
|
+
(4 * @size).times do
|
64
|
+
@obj << ob
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
|
-
|
69
|
-
|
68
|
+
@json = Oj.dump(@obj)
|
69
|
+
@failed = {} # key is same as String used in tests later
|
70
70
|
|
71
71
|
def capture_error(tag, orig, load_key, dump_key, &blk)
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
$failed[tag] = "#{e.class}: #{e.message}"
|
77
|
-
end
|
72
|
+
obj = blk.call(orig)
|
73
|
+
raise "#{tag} #{dump_key} and #{load_key} did not return the same object as the original." unless orig == obj
|
74
|
+
rescue Exception => e
|
75
|
+
@failed[tag] = "#{e.class}: #{e.message}"
|
78
76
|
end
|
79
77
|
|
80
78
|
# Verify that all packages dump and load correctly and return the same Object as the original.
|
81
|
-
capture_error('Oj:strict',
|
79
|
+
capture_error('Oj:strict', @obj, 'load', 'dump') { |o|
|
82
80
|
Oj.strict_load(Oj.dump(o))
|
83
81
|
}
|
84
|
-
capture_error('Yajl',
|
82
|
+
capture_error('Yajl', @obj, 'encode', 'parse') { |o|
|
85
83
|
require 'yajl'
|
86
84
|
Yajl::Parser.parse(Yajl::Encoder.encode(o))
|
87
85
|
}
|
88
|
-
capture_error('JSON::Ext',
|
86
|
+
capture_error('JSON::Ext', @obj, 'generate', 'parse') { |o|
|
89
87
|
require 'json'
|
90
88
|
require 'json/ext'
|
91
89
|
JSON.generator = JSON::Ext::Generator
|
@@ -93,47 +91,47 @@ capture_error('JSON::Ext', $obj, 'generate', 'parse') { |o|
|
|
93
91
|
JSON.parse(JSON.generate(o))
|
94
92
|
}
|
95
93
|
|
96
|
-
Oj.default_options = { symbol_keys:
|
94
|
+
Oj.default_options = { symbol_keys: @symbolize }
|
97
95
|
|
98
|
-
if
|
99
|
-
puts "json:\n#{
|
100
|
-
puts "Oj loaded object:\n#{Oj.strict_load(
|
101
|
-
puts "Yajl loaded object:\n#{Yajl::Parser.parse(
|
102
|
-
puts "JSON loaded object:\n#{JSON::Ext::Parser.new(
|
96
|
+
if @verbose
|
97
|
+
puts "json:\n#{@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"
|
103
101
|
end
|
104
102
|
|
105
103
|
puts '-' * 80
|
106
|
-
puts
|
104
|
+
puts 'Strict Parse Performance'
|
107
105
|
perf = Perf.new()
|
108
|
-
unless
|
109
|
-
perf.add('JSON::Ext', 'parse') { JSON.parse(
|
106
|
+
unless @failed.key?('JSON::Ext')
|
107
|
+
perf.add('JSON::Ext', 'parse') { JSON.parse(@json, symbolize_names: @symbolize) }
|
110
108
|
perf.before('JSON::Ext') { JSON.parser = JSON::Ext::Parser }
|
111
109
|
end
|
112
|
-
unless
|
113
|
-
perf.add('Oj:strict', 'strict_load') { Oj.strict_load(
|
114
|
-
perf.add('Oj:wab', 'wab_load') { Oj.wab_load(
|
110
|
+
unless @failed.key?('Oj:strict')
|
111
|
+
perf.add('Oj:strict', 'strict_load') { Oj.strict_load(@json) }
|
112
|
+
perf.add('Oj:wab', 'wab_load') { Oj.wab_load(@json) }
|
115
113
|
end
|
116
|
-
perf.add('Yajl', 'parse') { Yajl::Parser.parse(
|
117
|
-
perf.run(
|
114
|
+
perf.add('Yajl', 'parse') { Yajl::Parser.parse(@json) } unless @failed.key?('Yajl')
|
115
|
+
perf.run(@iter)
|
118
116
|
|
119
117
|
puts '-' * 80
|
120
|
-
puts
|
118
|
+
puts 'Strict Dump Performance'
|
121
119
|
perf = Perf.new()
|
122
|
-
unless
|
123
|
-
perf.add('JSON::Ext', 'dump') { JSON.generate(
|
120
|
+
unless @failed.key?('JSON::Ext')
|
121
|
+
perf.add('JSON::Ext', 'dump') { JSON.generate(@obj) }
|
124
122
|
perf.before('JSON::Ext') { JSON.generator = JSON::Ext::Generator }
|
125
123
|
end
|
126
|
-
unless
|
127
|
-
perf.add('Oj:strict', 'dump') { Oj.dump(
|
124
|
+
unless @failed.key?('Oj:strict')
|
125
|
+
perf.add('Oj:strict', 'dump') { Oj.dump(@obj) }
|
128
126
|
end
|
129
|
-
perf.add('Yajl', 'encode') { Yajl::Encoder.encode(
|
130
|
-
perf.run(
|
127
|
+
perf.add('Yajl', 'encode') { Yajl::Encoder.encode(@obj) } unless @failed.key?('Yajl')
|
128
|
+
perf.run(@iter)
|
131
129
|
|
132
130
|
puts
|
133
131
|
puts '-' * 80
|
134
132
|
puts
|
135
133
|
|
136
|
-
unless
|
137
|
-
puts
|
138
|
-
|
134
|
+
unless @failed.empty?
|
135
|
+
puts 'The following packages were not included for the reason listed'
|
136
|
+
@failed.each { |tag, msg| puts "***** #{tag}: #{msg}" }
|
139
137
|
end
|
data/test/perf_wab.rb
CHANGED
@@ -1,131 +1,129 @@
|
|
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'
|
10
10
|
require 'oj'
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
@verbose = false
|
13
|
+
@indent = 0
|
14
|
+
@iter = 20_000
|
15
|
+
@with_bignum = false
|
16
|
+
@with_nums = true
|
17
|
+
@size = 0
|
18
18
|
|
19
19
|
opts = OptionParser.new
|
20
|
-
opts.on(
|
21
|
-
opts.on(
|
22
|
-
opts.on(
|
23
|
-
opts.on(
|
24
|
-
opts.on(
|
25
|
-
opts.on(
|
26
|
-
|
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('-h', '--help', 'Show this display') { puts opts; Process.exit!(0) }
|
26
|
+
opts.parse(ARGV)
|
27
27
|
|
28
|
-
|
28
|
+
@obj = {
|
29
29
|
a: 'Alpha', # string
|
30
30
|
b: true, # boolean
|
31
|
-
c:
|
32
|
-
d: [ true, [false, [-
|
31
|
+
c: 12_345, # number
|
32
|
+
d: [ true, [false, [-123_456_789, nil], 3.9676, ['Something else.', false], nil]], # mix it up array
|
33
33
|
e: { zero: nil, one: 1, two: 2, three: [3], four: [0, 1, 2, 3, 4] }, # hash
|
34
34
|
f: nil, # nil
|
35
35
|
h: { a: { b: { c: { d: {e: { f: { g: nil }}}}}}}, # deep hash, not that deep
|
36
36
|
i: [[[[[[[nil]]]]]]] # deep array, again, not that deep
|
37
37
|
}
|
38
|
-
|
38
|
+
@obj[:g] = 12_345_678_901_234_567_890_123_456_789 if @with_bignum
|
39
39
|
|
40
|
-
Oj.default_options = { :indent =>
|
40
|
+
Oj.default_options = { :indent => @indent, :mode => :wab }
|
41
41
|
|
42
|
-
if 0 <
|
43
|
-
|
44
|
-
|
45
|
-
(4 *
|
46
|
-
|
42
|
+
if 0 < @size
|
43
|
+
ob = @obj
|
44
|
+
@obj = []
|
45
|
+
(4 * @size).times do
|
46
|
+
@obj << ob
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
|
51
|
-
|
52
|
-
#puts "*** size: #{
|
53
|
-
#puts "*** #{
|
54
|
-
|
50
|
+
@json = Oj.dump(@obj)
|
51
|
+
@obj_json = Oj.dump(@obj, :mode => :object)
|
52
|
+
# puts "*** size: #{@obj_json.size}"
|
53
|
+
# puts "*** #{@obj_json}"
|
54
|
+
@failed = {} # key is same as String used in tests later
|
55
55
|
|
56
56
|
def capture_error(tag, orig, load_key, dump_key, &blk)
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
$failed[tag] = "#{e.class}: #{e.message}"
|
62
|
-
end
|
57
|
+
obj = blk.call(orig)
|
58
|
+
raise "#{tag} #{dump_key} and #{load_key} did not return the same object as the original." unless orig == obj
|
59
|
+
rescue Exception => e
|
60
|
+
@failed[tag] = "#{e.class}: #{e.message}"
|
63
61
|
end
|
64
62
|
|
65
63
|
# Verify that all packages dump and load correctly and return the same Object as the original.
|
66
|
-
capture_error('Oj:wab',
|
67
|
-
capture_error('Yajl',
|
68
|
-
capture_error('JSON::Ext',
|
64
|
+
capture_error('Oj:wab', @obj, 'load', 'dump') { |o| Oj.wab_load(Oj.dump(o, :mode => :wab)) }
|
65
|
+
capture_error('Yajl', @obj, 'encode', 'parse') { |o| require 'yajl'; Yajl::Parser.parse(Yajl::Encoder.encode(o)) }
|
66
|
+
capture_error('JSON::Ext', @obj, 'generate', 'parse') { |o|
|
69
67
|
require 'json'
|
70
68
|
require 'json/ext'
|
71
69
|
JSON.generator = JSON::Ext::Generator
|
72
70
|
JSON.parser = JSON::Ext::Parser
|
73
71
|
JSON.parse(JSON.generate(o))
|
74
72
|
}
|
75
|
-
capture_error('JSON::Pure',
|
73
|
+
capture_error('JSON::Pure', @obj, 'generate', 'parse') { |o|
|
76
74
|
require 'json/pure'
|
77
75
|
JSON.generator = JSON::Pure::Generator
|
78
76
|
JSON.parser = JSON::Pure::Parser
|
79
77
|
JSON.parse(JSON.generate(o))
|
80
78
|
}
|
81
79
|
|
82
|
-
if
|
83
|
-
puts "json:\n#{
|
84
|
-
puts "object json:\n#{
|
85
|
-
puts "Oj loaded object:\n#{Oj.wab_load(
|
86
|
-
puts "Yajl loaded object:\n#{Yajl::Parser.parse(
|
87
|
-
puts "JSON loaded object:\n#{JSON::Ext::Parser.new(
|
80
|
+
if @verbose
|
81
|
+
puts "json:\n#{@json}\n"
|
82
|
+
puts "object json:\n#{@obj_json}\n"
|
83
|
+
puts "Oj loaded object:\n#{Oj.wab_load(@json)}\n"
|
84
|
+
puts "Yajl loaded object:\n#{Yajl::Parser.parse(@json)}\n"
|
85
|
+
puts "JSON loaded object:\n#{JSON::Ext::Parser.new(@json).parse}\n"
|
88
86
|
end
|
89
87
|
|
90
88
|
puts '-' * 80
|
91
|
-
puts
|
89
|
+
puts 'Wab Parse Performance'
|
92
90
|
perf = Perf.new()
|
93
|
-
unless
|
94
|
-
perf.add('JSON::Ext', 'parse') { JSON.parse(
|
91
|
+
unless @failed.key?('JSON::Ext')
|
92
|
+
perf.add('JSON::Ext', 'parse') { JSON.parse(@json) }
|
95
93
|
perf.before('JSON::Ext') { JSON.parser = JSON::Ext::Parser }
|
96
94
|
end
|
97
|
-
unless
|
98
|
-
perf.add('JSON::Pure', 'parse') { JSON.parse(
|
95
|
+
unless @failed.key?('JSON::Pure')
|
96
|
+
perf.add('JSON::Pure', 'parse') { JSON.parse(@json) }
|
99
97
|
perf.before('JSON::Pure') { JSON.parser = JSON::Pure::Parser }
|
100
98
|
end
|
101
|
-
unless
|
102
|
-
perf.add('Oj:wab', 'wab_load') { Oj.wab_load(
|
99
|
+
unless @failed.key?('Oj:wab')
|
100
|
+
perf.add('Oj:wab', 'wab_load') { Oj.wab_load(@json) }
|
103
101
|
end
|
104
|
-
perf.add('Yajl', 'parse') { Yajl::Parser.parse(
|
105
|
-
perf.run(
|
102
|
+
perf.add('Yajl', 'parse') { Yajl::Parser.parse(@json) } unless @failed.key?('Yajl')
|
103
|
+
perf.run(@iter)
|
106
104
|
|
107
105
|
puts '-' * 80
|
108
|
-
puts
|
106
|
+
puts 'Wab Dump Performance'
|
109
107
|
perf = Perf.new()
|
110
|
-
unless
|
111
|
-
perf.add('JSON::Ext', 'dump') { JSON.generate(
|
108
|
+
unless @failed.key?('JSON::Ext')
|
109
|
+
perf.add('JSON::Ext', 'dump') { JSON.generate(@obj) }
|
112
110
|
perf.before('JSON::Ext') { JSON.generator = JSON::Ext::Generator }
|
113
111
|
end
|
114
|
-
unless
|
115
|
-
perf.add('JSON::Pure', 'generate') { JSON.generate(
|
112
|
+
unless @failed.key?('JSON::Pure')
|
113
|
+
perf.add('JSON::Pure', 'generate') { JSON.generate(@obj) }
|
116
114
|
perf.before('JSON::Pure') { JSON.generator = JSON::Pure::Generator }
|
117
115
|
end
|
118
|
-
unless
|
119
|
-
perf.add('Oj:wab', 'dump') { Oj.dump(
|
116
|
+
unless @failed.key?('Oj:wab')
|
117
|
+
perf.add('Oj:wab', 'dump') { Oj.dump(@obj, :mode => :wab) }
|
120
118
|
end
|
121
|
-
perf.add('Yajl', 'encode') { Yajl::Encoder.encode(
|
122
|
-
perf.run(
|
119
|
+
perf.add('Yajl', 'encode') { Yajl::Encoder.encode(@obj) } unless @failed.key?('Yajl')
|
120
|
+
perf.run(@iter)
|
123
121
|
|
124
122
|
puts
|
125
123
|
puts '-' * 80
|
126
124
|
puts
|
127
125
|
|
128
|
-
unless
|
129
|
-
puts
|
130
|
-
|
126
|
+
unless @failed.empty?
|
127
|
+
puts 'The following packages were not included for the reason listed'
|
128
|
+
@failed.each { |tag, msg| puts "***** #{tag}: #{msg}" }
|
131
129
|
end
|
data/test/prec.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'oj'
|
4
4
|
|
5
|
-
extras = {
|
5
|
+
extras = {'locationLng' => -97.14690769100295}
|
6
6
|
|
7
7
|
Oj.default_options = {float_precision: 17}
|
8
8
|
|
@@ -10,13 +10,13 @@ encoded = Oj.dump(extras)
|
|
10
10
|
puts encoded
|
11
11
|
puts Oj.load(encoded)
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'active_record'
|
14
14
|
|
15
15
|
Oj::Rails.set_encoder()
|
16
16
|
Oj::Rails.set_decoder()
|
17
17
|
|
18
18
|
Oj.default_options = {float_precision: 17}
|
19
|
-
# Using Oj rails encoder, gets the correct value: {
|
19
|
+
# Using Oj rails encoder, gets the correct value: {'locationLng':-97.14690769100295}
|
20
20
|
encoded = ActiveSupport::JSON.encode(extras)
|
21
21
|
puts encoded
|
22
22
|
puts ActiveSupport::JSON.decode(encoded)
|