oj 1.3.4 → 1.3.5
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 +2 -2
- data/ext/oj/oj.c +1 -0
- data/lib/oj.rb +1 -0
- data/lib/oj/mimic.rb +11 -0
- 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
- metadata +7 -8
- data/test/boo.rb +0 -26
- data/test/bug.rb +0 -18
- data/test/oj-test/test.rb +0 -137
- data/test/reddit.rb +0 -23
- data/test/where.rb +0 -54
data/README.md
CHANGED
@@ -32,9 +32,9 @@ A fast JSON parser and Object marshaller as a Ruby gem.
|
|
32
32
|
|
33
33
|
## <a name="release">Release Notes</a>
|
34
34
|
|
35
|
-
### Release 1.3.
|
35
|
+
### Release 1.3.5
|
36
36
|
|
37
|
-
- Fixed mimic_JSON so it convinces Ruby that the json gem
|
37
|
+
- Fixed mimic_JSON so it convinces Ruby that the **ALL** versions of the json gem are already loaded.
|
38
38
|
|
39
39
|
## <a name="description">Description</a>
|
40
40
|
|
data/ext/oj/oj.c
CHANGED
@@ -814,6 +814,7 @@ define_mimic_json(VALUE self) {
|
|
814
814
|
dummy = rb_gv_get("$LOADED_FEATURES");
|
815
815
|
if (rb_type(dummy) == T_ARRAY) {
|
816
816
|
rb_ary_push(dummy, rb_str_new2("json"));
|
817
|
+
rb_funcall2(Oj, rb_intern("mimic_loaded"), 0, 0);
|
817
818
|
}
|
818
819
|
|
819
820
|
rb_define_module_function(mimic, "parser=", no_op1, 1);
|
data/lib/oj.rb
CHANGED
data/lib/oj/mimic.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
|
2
|
+
module Oj
|
3
|
+
|
4
|
+
def self.mimic_loaded()
|
5
|
+
gems_dir = File.dirname(File.dirname(File.dirname(File.dirname(__FILE__))))
|
6
|
+
Dir.foreach(gems_dir) do |gem|
|
7
|
+
next unless gem.start_with?('json-')
|
8
|
+
$LOADED_FEATURES << File.join(gems_dir, gem, 'lib', 'json.rb')
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
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
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: oj
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-09-25 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: ! 'The fastest JSON parser and object serializer. '
|
15
15
|
email: peter@ohler.com
|
@@ -20,6 +20,7 @@ extra_rdoc_files:
|
|
20
20
|
- README.md
|
21
21
|
files:
|
22
22
|
- lib/oj/bag.rb
|
23
|
+
- lib/oj/mimic.rb
|
23
24
|
- lib/oj/version.rb
|
24
25
|
- lib/oj.rb
|
25
26
|
- ext/oj/extconf.rb
|
@@ -32,17 +33,15 @@ files:
|
|
32
33
|
- ext/oj/fast.c
|
33
34
|
- ext/oj/load.c
|
34
35
|
- ext/oj/oj.c
|
35
|
-
- test/boo.rb
|
36
|
-
- test/bug.rb
|
37
36
|
- test/files.rb
|
38
|
-
- test/foo.rb
|
39
|
-
- test/oj-test/test.rb
|
40
37
|
- test/perf.rb
|
38
|
+
- test/perf1.rb
|
39
|
+
- test/perf2.rb
|
41
40
|
- test/perf_fast.rb
|
42
41
|
- test/perf_obj.rb
|
42
|
+
- test/perf_obj_old.rb
|
43
43
|
- test/perf_simple.rb
|
44
44
|
- test/perf_strict.rb
|
45
|
-
- test/reddit.rb
|
46
45
|
- test/sample/change.rb
|
47
46
|
- test/sample/dir.rb
|
48
47
|
- test/sample/doc.rb
|
@@ -60,7 +59,6 @@ files:
|
|
60
59
|
- test/test_fast.rb
|
61
60
|
- test/test_mimic.rb
|
62
61
|
- test/tests.rb
|
63
|
-
- test/where.rb
|
64
62
|
- LICENSE
|
65
63
|
- README.md
|
66
64
|
homepage: http://www.ohler.com/oj
|
@@ -91,3 +89,4 @@ signing_key:
|
|
91
89
|
specification_version: 3
|
92
90
|
summary: A fast JSON parser and serializer.
|
93
91
|
test_files: []
|
92
|
+
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/bug.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
|
2
|
-
$: << File.join(File.dirname(__FILE__), "../lib")
|
3
|
-
$: << File.join(File.dirname(__FILE__), "../ext")
|
4
|
-
|
5
|
-
require 'oj'
|
6
|
-
require 'bigdecimal'
|
7
|
-
|
8
|
-
stuff = [
|
9
|
-
BigDecimal.new('10'),
|
10
|
-
Date.today,
|
11
|
-
Time.now,
|
12
|
-
DateTime.now
|
13
|
-
]
|
14
|
-
|
15
|
-
puts Oj.dump(stuff, :mode => :strict)
|
16
|
-
puts Oj.dump(stuff, :mode => :compat)
|
17
|
-
puts Oj.dump(stuff, :mode => :object)
|
18
|
-
|
data/test/oj-test/test.rb
DELETED
@@ -1,137 +0,0 @@
|
|
1
|
-
require 'cgi'
|
2
|
-
require 'oj'
|
3
|
-
|
4
|
-
AD_MARKUP = CGI.escape("asdf" * 100)
|
5
|
-
|
6
|
-
SEATBID = '{
|
7
|
-
"bid" : [{
|
8
|
-
"id": "1",
|
9
|
-
"impid" : "102",
|
10
|
-
"price": 9.43,
|
11
|
-
"adid" : "314",
|
12
|
-
"nurl": "http://adserver.com/winnotice?impid=102",
|
13
|
-
"adm" : "' + AD_MARKUP + '",
|
14
|
-
"adomain" : ["advertiserdomain.com"],
|
15
|
-
"iurl" : "http://adserver.com/pathtosampleimage",
|
16
|
-
"cid" : "campaign111",
|
17
|
-
"crid" : "creative112",
|
18
|
-
"attr" : [1,2,3,4,5,6,7,12]
|
19
|
-
}],
|
20
|
-
"seat" : "512",
|
21
|
-
"group" : "128"
|
22
|
-
}'
|
23
|
-
|
24
|
-
|
25
|
-
LARGE_JSON = '{
|
26
|
-
"id": "1234567890",
|
27
|
-
"units" : 0,
|
28
|
-
"bidid": "abc1123",
|
29
|
-
"cur": "EUR",
|
30
|
-
"seatbid": [' + ([SEATBID] * 100).join(', ') + ']
|
31
|
-
}'
|
32
|
-
|
33
|
-
|
34
|
-
class Bid
|
35
|
-
|
36
|
-
attr_accessor :id,
|
37
|
-
:bidid,
|
38
|
-
:cur,
|
39
|
-
:seat,
|
40
|
-
:group,
|
41
|
-
:impid,
|
42
|
-
:price,
|
43
|
-
:units,
|
44
|
-
:adid,
|
45
|
-
:nurl,
|
46
|
-
:adm,
|
47
|
-
:adomain,
|
48
|
-
:iurl,
|
49
|
-
:cid,
|
50
|
-
:crid,
|
51
|
-
:attr,
|
52
|
-
:nbr,
|
53
|
-
:partner_id
|
54
|
-
|
55
|
-
alias :currency :cur
|
56
|
-
alias :auction_id :id
|
57
|
-
|
58
|
-
def parsed_adm
|
59
|
-
return replace_macros(self.adm)
|
60
|
-
end
|
61
|
-
|
62
|
-
def parsed_nurl
|
63
|
-
return replace_macros(self.nurl)
|
64
|
-
end
|
65
|
-
|
66
|
-
def replace_macros(template)
|
67
|
-
return nil if !template
|
68
|
-
{
|
69
|
-
'${AUCTION_ID}' => self.id,
|
70
|
-
'${AUCTION_BID_ID}' => self.bidid,
|
71
|
-
'${AUCTION_IMP_ID}' => self.impid,
|
72
|
-
'${AUCTION_SEAT_ID}' => self.seat,
|
73
|
-
'${AUCTION_AD_ID}' => self.adid,
|
74
|
-
'${AUCTION_PRICE}' => self.price,
|
75
|
-
'${AUCTION_CURRENCY}' => self.cur,
|
76
|
-
'${AUCTION_UNITS}' => self.units,
|
77
|
-
}.each do |macro, v|
|
78
|
-
template = template.gsub(macro, v.to_s)
|
79
|
-
end
|
80
|
-
template
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
class BidResponseParser
|
85
|
-
REQUIRED_ATTRIBUTES = [:id, :impid, :price].freeze
|
86
|
-
|
87
|
-
def self.parse(json)
|
88
|
-
return nil if !json
|
89
|
-
extract_fast(json)
|
90
|
-
end
|
91
|
-
|
92
|
-
def self.extract_fast(json)
|
93
|
-
bid = nil
|
94
|
-
Oj::Doc.open(json) do |doc|
|
95
|
-
bid = Bid.new
|
96
|
-
|
97
|
-
# bid-response object
|
98
|
-
bid.id = doc.fetch '/id'
|
99
|
-
|
100
|
-
bid.bidid = doc.fetch '/bidid'
|
101
|
-
bid.units = doc.fetch('/units') || 0
|
102
|
-
bid.cur = doc.fetch '/cur'
|
103
|
-
bid.nbr = doc.fetch('/nbr') || 0 # Mobile RTB 1.0 only
|
104
|
-
|
105
|
-
# EM: we do not expect more than 1 bid object in the response,
|
106
|
-
# as we only send single ads in the bid-request (no multi-ad-auctions) atm.
|
107
|
-
# seatbid-obj
|
108
|
-
bid.seat = doc.fetch '/seatbid/0/seat'
|
109
|
-
bid.group = doc.fetch '/seatbid/0/group'
|
110
|
-
|
111
|
-
# bid-obj
|
112
|
-
bid_path = '/seatbid/0/bid/0'
|
113
|
-
bid.impid = doc.fetch "#{bid_path}/impid"
|
114
|
-
bid.adid = doc.fetch "#{bid_path}/adid"
|
115
|
-
bid.nurl = doc.fetch "#{bid_path}/nurl"
|
116
|
-
bid.adm = doc.fetch "#{bid_path}/adm"
|
117
|
-
bid.adomain = doc.fetch "#{bid_path}/adomain"
|
118
|
-
bid.iurl = doc.fetch "#{bid_path}/iurl"
|
119
|
-
bid.cid = doc.fetch "#{bid_path}/cid"
|
120
|
-
bid.crid = doc.fetch "#{bid_path}/crid"
|
121
|
-
bid.attr = doc.fetch "#{bid_path}/attr"
|
122
|
-
|
123
|
-
# sadly we need to check this explicitly, because nil.to_f returns 0.0
|
124
|
-
if doc.fetch("#{bid_path}/price") == nil
|
125
|
-
raise "required attribute price missing"
|
126
|
-
end
|
127
|
-
|
128
|
-
bid.price = doc.fetch("#{bid_path}/price").to_f
|
129
|
-
end
|
130
|
-
|
131
|
-
return bid
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
1000.times do
|
136
|
-
BidResponseParser.parse(LARGE_JSON)
|
137
|
-
end
|
data/test/reddit.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
require 'benchmark'
|
3
|
-
require 'oj'
|
4
|
-
require 'yajl'
|
5
|
-
|
6
|
-
a = {'asdfg'=> 'asdfg', 'qwert'=> 'asdfatqwtrqewt', 'rewqrq'=>543252, 'reqrqwer'=>[143245,1234421]}
|
7
|
-
j = a.to_json
|
8
|
-
|
9
|
-
N = (ARGV[0] || 100000).to_i
|
10
|
-
|
11
|
-
Benchmark.bmbm(6) do |x|
|
12
|
-
x.report('json g') do N.times{|_| a['vczx'] = _; a.to_json } end
|
13
|
-
x.report('yajl g') do N.times{|_| a['vczx'] = _; Yajl.dump(a)} end
|
14
|
-
x.report('oj g') do N.times{|_| a['vczx'] = _; Oj.dump(a)} end
|
15
|
-
x.report('oj g2') do N.times{|_| a['vczx'] = _; Oj.dump(a)} end
|
16
|
-
x.report('ojc g') do N.times{|_| a['vczx'] = _; Oj.dump(a, mode: :compat)} end
|
17
|
-
x.report('json p') do N.times{|_| a['vczx'] = _; JSON.parse(j)} end
|
18
|
-
x.report('yajl p') do N.times{|_| a['vczx'] = _; Yajl.load(j)} end
|
19
|
-
x.report('oj g') do N.times{|_| a['vczx'] = _; Oj.load(j)} end
|
20
|
-
x.report('ojc g') do N.times{|_| a['vczx'] = _; Oj.load(j, mode: :compat)} end
|
21
|
-
x.report('ojdocg2') do N.times{|_| a['vczx'] = _; Oj::Doc.open(j) { |x| x.fetch('asdfg') } } end
|
22
|
-
end
|
23
|
-
|
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
|