oj 1.2.8 → 1.2.9
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of oj might be problematic. Click here for more details.
- data/README.md +6 -5
- data/ext/oj/dump.c +6 -6
- data/lib/oj/version.rb +1 -1
- data/test/perf1.rb +64 -0
- data/test/{foo.rb → perf2.rb} +30 -12
- data/test/perf_obj_old.rb +213 -0
- data/test/perf_simple.rb +2 -2
- data/test/perf_strict.rb +2 -2
- data/test/tests.rb +1 -0
- metadata +31 -24
- data/test/boo.rb +0 -26
- data/test/where.rb +0 -54
data/README.md
CHANGED
@@ -24,11 +24,9 @@ A fast JSON parser and Object marshaller as a Ruby gem.
|
|
24
24
|
|
25
25
|
## <a name="release">Release Notes</a>
|
26
26
|
|
27
|
-
### Release 1.2.
|
27
|
+
### Release 1.2.9
|
28
28
|
|
29
|
-
-
|
30
|
-
|
31
|
-
- Included a fix to the documentation found by mat.
|
29
|
+
- Changed the error message for invalid keys in compat mode to identify offending type.
|
32
30
|
|
33
31
|
## <a name="description">Description</a>
|
34
32
|
|
@@ -57,7 +55,10 @@ to_hash() is more flexible and produces more consistent output so it has a
|
|
57
55
|
preference over the to_json() method. If neither the to_json() or to_hash()
|
58
56
|
methods exist then the Oj internal Object variable encoding is used.
|
59
57
|
|
60
|
-
Oj is compatible with Ruby 1.8.7, 1.9.2, 1.9.3, JRuby, and
|
58
|
+
Oj is compatible with Ruby 1.8.7, 1.9.2, 1.9.3, JRuby, RBX, and the latest 2.0dev.
|
59
|
+
|
60
|
+
Oj is also compatible with Rails. Just make sure the Oj gem is installed and
|
61
|
+
[multi_json](https://github.com/intridea/multi_json) will pick it up and use it.
|
61
62
|
|
62
63
|
## <a name="compare">Comparisons</a>
|
63
64
|
|
data/ext/oj/dump.c
CHANGED
@@ -652,7 +652,7 @@ hash_cb_strict(VALUE key, VALUE value, Out out) {
|
|
652
652
|
long size;
|
653
653
|
|
654
654
|
if (rb_type(key) != T_STRING) {
|
655
|
-
rb_raise(rb_eTypeError, "In :strict mode all Hash keys must be Strings
|
655
|
+
rb_raise(rb_eTypeError, "In :strict mode all Hash keys must be Strings, not %s.\n", rb_class2name(rb_obj_class(key)));
|
656
656
|
}
|
657
657
|
if (0 == out->opts->dump_opts) {
|
658
658
|
size = depth * out->indent + 1;
|
@@ -736,7 +736,7 @@ hash_cb_compat(VALUE key, VALUE value, Out out) {
|
|
736
736
|
dump_sym_comp(key, out);
|
737
737
|
break;
|
738
738
|
default:
|
739
|
-
rb_raise(rb_eTypeError, "In :
|
739
|
+
rb_raise(rb_eTypeError, "In :compat mode all Hash keys must be Strings or Symbols, not %s.\n", rb_class2name(rb_obj_class(key)));
|
740
740
|
break;
|
741
741
|
}
|
742
742
|
if (0 == out->opts->dump_opts) {
|
@@ -1361,7 +1361,7 @@ dump_leaf_str(Leaf leaf, Out out) {
|
|
1361
1361
|
break;
|
1362
1362
|
case COL_VAL:
|
1363
1363
|
default:
|
1364
|
-
rb_raise(rb_eTypeError, "Unexpected value type %02x
|
1364
|
+
rb_raise(rb_eTypeError, "Unexpected value type %02x.\n", leaf->value_type);
|
1365
1365
|
break;
|
1366
1366
|
}
|
1367
1367
|
}
|
@@ -1381,7 +1381,7 @@ dump_leaf_fixnum(Leaf leaf, Out out) {
|
|
1381
1381
|
break;
|
1382
1382
|
case COL_VAL:
|
1383
1383
|
default:
|
1384
|
-
rb_raise(rb_eTypeError, "Unexpected value type %02x
|
1384
|
+
rb_raise(rb_eTypeError, "Unexpected value type %02x.\n", leaf->value_type);
|
1385
1385
|
break;
|
1386
1386
|
}
|
1387
1387
|
}
|
@@ -1397,7 +1397,7 @@ dump_leaf_float(Leaf leaf, Out out) {
|
|
1397
1397
|
break;
|
1398
1398
|
case COL_VAL:
|
1399
1399
|
default:
|
1400
|
-
rb_raise(rb_eTypeError, "Unexpected value type %02x
|
1400
|
+
rb_raise(rb_eTypeError, "Unexpected value type %02x.\n", leaf->value_type);
|
1401
1401
|
break;
|
1402
1402
|
}
|
1403
1403
|
}
|
@@ -1508,7 +1508,7 @@ dump_leaf(Leaf leaf, int depth, Out out) {
|
|
1508
1508
|
dump_leaf_hash(leaf, depth, out);
|
1509
1509
|
break;
|
1510
1510
|
default:
|
1511
|
-
rb_raise(rb_eTypeError, "Unexpected type %02x
|
1511
|
+
rb_raise(rb_eTypeError, "Unexpected type %02x.\n", leaf->type);
|
1512
1512
|
break;
|
1513
1513
|
}
|
1514
1514
|
}
|
data/lib/oj/version.rb
CHANGED
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/{foo.rb → perf2.rb}
RENAMED
@@ -15,6 +15,19 @@ opts = OptionParser.new
|
|
15
15
|
opts.on("-h", "--help", "Show this display") { puts opts; Process.exit!(0) }
|
16
16
|
files = opts.parse(ARGV)
|
17
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
|
+
|
18
31
|
iter = 100000
|
19
32
|
s = %{
|
20
33
|
{ "class": "Foo::Bar",
|
@@ -23,36 +36,41 @@ s = %{
|
|
23
36
|
}
|
24
37
|
}
|
25
38
|
|
39
|
+
obj = Oj.load(s)
|
40
|
+
obj["foo"] = Foo.new()
|
41
|
+
|
42
|
+
Oj.default_options = { :indent => 0, :effort => :internal }
|
43
|
+
|
44
|
+
puts
|
45
|
+
|
26
46
|
start = Time.now
|
27
47
|
iter.times do
|
28
48
|
Oj.load(s)
|
29
49
|
end
|
30
|
-
|
31
|
-
puts "%d Oj.load()s in %0.3f seconds or %0.1f loads/msec" % [iter,
|
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]
|
32
52
|
|
33
53
|
start = Time.now
|
34
54
|
iter.times do
|
35
55
|
Yajl::Parser.parse(s)
|
36
56
|
end
|
37
|
-
|
38
|
-
puts "%d Yajl::Parser.parse()s in %0.3f seconds or %0.1f parses/msec" % [iter,
|
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]
|
39
59
|
|
40
|
-
puts
|
60
|
+
puts
|
41
61
|
|
42
|
-
|
43
|
-
obj = Oj.load(s)
|
44
62
|
start = Time.now
|
45
63
|
iter.times do
|
46
64
|
Oj.dump(obj)
|
47
65
|
end
|
48
|
-
|
49
|
-
puts "%d Oj.dump()s in %0.3f seconds or %0.1f dumps/msec" % [iter,
|
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]
|
50
68
|
|
51
69
|
start = Time.now
|
52
70
|
iter.times do
|
53
71
|
Yajl::Encoder.encode(obj)
|
54
72
|
end
|
55
|
-
|
56
|
-
puts "%d Yajl::Encoder.encode()s in %0.3f seconds or %0.1f encodes/msec" % [iter,
|
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]
|
57
75
|
|
58
|
-
puts
|
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
|
data/test/perf_simple.rb
CHANGED
data/test/perf_strict.rb
CHANGED
data/test/tests.rb
CHANGED
metadata
CHANGED
@@ -1,24 +1,27 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: oj
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.8
|
3
|
+
version: !ruby/object:Gem::Version
|
5
4
|
prerelease:
|
5
|
+
version: 1.2.9
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Peter Ohler
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
12
|
+
|
13
|
+
date: 2012-05-29 00:00:00 Z
|
13
14
|
dependencies: []
|
14
|
-
|
15
|
+
|
16
|
+
description: "The fastest JSON parser and object serializer. "
|
15
17
|
email: peter@ohler.com
|
16
18
|
executables: []
|
17
|
-
|
19
|
+
|
20
|
+
extensions:
|
18
21
|
- ext/oj/extconf.rb
|
19
|
-
extra_rdoc_files:
|
22
|
+
extra_rdoc_files:
|
20
23
|
- README.md
|
21
|
-
files:
|
24
|
+
files:
|
22
25
|
- lib/oj/bag.rb
|
23
26
|
- lib/oj/version.rb
|
24
27
|
- lib/oj.rb
|
@@ -32,12 +35,13 @@ files:
|
|
32
35
|
- ext/oj/fast.c
|
33
36
|
- ext/oj/load.c
|
34
37
|
- ext/oj/oj.c
|
35
|
-
- test/boo.rb
|
36
38
|
- test/files.rb
|
37
|
-
- test/foo.rb
|
38
39
|
- test/perf.rb
|
40
|
+
- test/perf1.rb
|
41
|
+
- test/perf2.rb
|
39
42
|
- test/perf_fast.rb
|
40
43
|
- test/perf_obj.rb
|
44
|
+
- test/perf_obj_old.rb
|
41
45
|
- test/perf_simple.rb
|
42
46
|
- test/perf_strict.rb
|
43
47
|
- test/sample/change.rb
|
@@ -57,34 +61,37 @@ files:
|
|
57
61
|
- test/test_fast.rb
|
58
62
|
- test/test_mimic.rb
|
59
63
|
- test/tests.rb
|
60
|
-
- test/where.rb
|
61
64
|
- LICENSE
|
62
65
|
- README.md
|
63
66
|
homepage: http://www.ohler.com/oj
|
64
67
|
licenses: []
|
68
|
+
|
65
69
|
post_install_message:
|
66
|
-
rdoc_options:
|
70
|
+
rdoc_options:
|
67
71
|
- --main
|
68
72
|
- README.md
|
69
|
-
require_paths:
|
73
|
+
require_paths:
|
70
74
|
- lib
|
71
75
|
- ext
|
72
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
77
|
none: false
|
74
|
-
requirements:
|
75
|
-
- -
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version:
|
78
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: "0"
|
82
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
83
|
none: false
|
80
|
-
requirements:
|
81
|
-
- -
|
82
|
-
- !ruby/object:Gem::Version
|
83
|
-
version:
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: "0"
|
84
88
|
requirements: []
|
89
|
+
|
85
90
|
rubyforge_project: oj
|
86
91
|
rubygems_version: 1.8.23
|
87
92
|
signing_key:
|
88
93
|
specification_version: 3
|
89
94
|
summary: A fast JSON parser and serializer.
|
90
95
|
test_files: []
|
96
|
+
|
97
|
+
has_rdoc: true
|
data/test/boo.rb
DELETED
@@ -1,26 +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 'yajl'
|
8
|
-
require 'oj'
|
9
|
-
|
10
|
-
iter = 100
|
11
|
-
s = File.read("boo.json")
|
12
|
-
start = Time.now
|
13
|
-
iter.times do
|
14
|
-
Oj.load(s)
|
15
|
-
end
|
16
|
-
oj_dt = Time.now - start
|
17
|
-
puts "%d Oj.load()s in %0.3f seconds or %0.1f loads/second" % [iter, oj_dt, iter/oj_dt]
|
18
|
-
|
19
|
-
start = Time.now
|
20
|
-
iter.times do
|
21
|
-
Yajl::Parser.parse(s)
|
22
|
-
end
|
23
|
-
yajl_dt = Time.now - start
|
24
|
-
puts "%d Yajl::Parser.parse()s in %0.3f seconds or %0.1f parsed/second" % [iter, yajl_dt, iter/yajl_dt]
|
25
|
-
|
26
|
-
puts "Oj is %0.1f times faster than YAJL" % [yajl_dt / oj_dt]
|
data/test/where.rb
DELETED
@@ -1,54 +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 = 1000000
|
15
|
-
|
16
|
-
opts = OptionParser.new
|
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("-h", "--help", "Show this display") { puts opts; Process.exit!(0) }
|
21
|
-
files = opts.parse(ARGV)
|
22
|
-
|
23
|
-
$obj = {
|
24
|
-
'a' => 'Alpha', # string
|
25
|
-
'b' => true, # boolean
|
26
|
-
'c' => 12345, # number
|
27
|
-
'd' => [ true, [false, [12345, nil], 3.967, ['something', false], nil]], # mix it up array
|
28
|
-
'e' => { 'one' => 1, 'two' => 2 }, # hash
|
29
|
-
'f' => nil, # nil
|
30
|
-
'g' => 12345678901234567890123456789, # big number
|
31
|
-
'h' => { 'a' => { 'b' => { 'c' => { 'd' => {'e' => { 'f' => { 'g' => nil }}}}}}}, # deep hash, not that deep
|
32
|
-
'i' => [[[[[[[nil]]]]]]] # deep array, again, not that deep
|
33
|
-
}
|
34
|
-
|
35
|
-
Oj.default_options = { :indent => $indent, :mode => :strict }
|
36
|
-
|
37
|
-
$json = Oj.dump($obj)
|
38
|
-
|
39
|
-
if $verbose
|
40
|
-
puts "json:\n#{$json}\n"
|
41
|
-
end
|
42
|
-
|
43
|
-
puts '-' * 80
|
44
|
-
puts "Parse Performance"
|
45
|
-
Oj::Fast.open($json) do |fast|
|
46
|
-
fast.move('/d/2/4/2')
|
47
|
-
puts fast.where2?
|
48
|
-
puts fast.where?
|
49
|
-
perf = Perf.new()
|
50
|
-
perf.add('Oj:fast', 'where') { fast.where? }
|
51
|
-
perf.add('Oj:fast2', 'where2') { fast.where2? }
|
52
|
-
perf.run($iter)
|
53
|
-
end
|
54
|
-
puts
|