oj 1.3.2 → 1.3.4
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/dump.c +6 -0
- data/ext/oj/oj.c +5 -0
- data/lib/oj/version.rb +1 -1
- data/test/boo.rb +26 -0
- data/test/bug.rb +18 -0
- data/test/{perf2.rb → foo.rb} +12 -30
- data/test/oj-test/test.rb +137 -0
- data/test/reddit.rb +23 -0
- data/test/where.rb +54 -0
- metadata +8 -6
- data/test/perf1.rb +0 -64
- data/test/perf_obj_old.rb +0 -213
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.4
|
36
36
|
|
37
|
-
- Fixed
|
37
|
+
- Fixed mimic_JSON so it convinces Ruby that the json gem is already loaded.
|
38
38
|
|
39
39
|
## <a name="description">Description</a>
|
40
40
|
|
data/ext/oj/dump.c
CHANGED
data/ext/oj/oj.c
CHANGED
@@ -810,6 +810,11 @@ define_mimic_json(VALUE self) {
|
|
810
810
|
ext = rb_define_module_under(mimic, "Ext");
|
811
811
|
dummy = rb_define_class_under(ext, "Parser", rb_cObject);
|
812
812
|
dummy = rb_define_class_under(ext, "Generator", rb_cObject);
|
813
|
+
// convince Ruby that the json gem has already been loaded
|
814
|
+
dummy = rb_gv_get("$LOADED_FEATURES");
|
815
|
+
if (rb_type(dummy) == T_ARRAY) {
|
816
|
+
rb_ary_push(dummy, rb_str_new2("json"));
|
817
|
+
}
|
813
818
|
|
814
819
|
rb_define_module_function(mimic, "parser=", no_op1, 1);
|
815
820
|
rb_define_module_function(mimic, "generator=", no_op1, 1);
|
data/lib/oj/version.rb
CHANGED
data/test/boo.rb
ADDED
@@ -0,0 +1,26 @@
|
|
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
ADDED
@@ -0,0 +1,18 @@
|
|
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/{perf2.rb → foo.rb}
RENAMED
@@ -15,19 +15,6 @@ 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
|
-
|
31
18
|
iter = 100000
|
32
19
|
s = %{
|
33
20
|
{ "class": "Foo::Bar",
|
@@ -36,41 +23,36 @@ s = %{
|
|
36
23
|
}
|
37
24
|
}
|
38
25
|
|
39
|
-
obj = Oj.load(s)
|
40
|
-
obj["foo"] = Foo.new()
|
41
|
-
|
42
|
-
Oj.default_options = { :indent => 0, :effort => :internal }
|
43
|
-
|
44
|
-
puts
|
45
|
-
|
46
26
|
start = Time.now
|
47
27
|
iter.times do
|
48
28
|
Oj.load(s)
|
49
29
|
end
|
50
|
-
|
51
|
-
puts "%d Oj.load()s in %0.3f seconds or %0.1f loads/msec" % [iter,
|
30
|
+
oj_dt = Time.now - start
|
31
|
+
puts "%d Oj.load()s in %0.3f seconds or %0.1f loads/msec" % [iter, oj_dt, iter/oj_dt/1000.0]
|
52
32
|
|
53
33
|
start = Time.now
|
54
34
|
iter.times do
|
55
35
|
Yajl::Parser.parse(s)
|
56
36
|
end
|
57
|
-
|
58
|
-
puts "%d Yajl::Parser.parse()s in %0.3f seconds or %0.1f parses/msec" % [iter,
|
37
|
+
yajl_dt = Time.now - start
|
38
|
+
puts "%d Yajl::Parser.parse()s in %0.3f seconds or %0.1f parses/msec" % [iter, yajl_dt, iter/yajl_dt/1000.0]
|
59
39
|
|
60
|
-
puts
|
40
|
+
puts "Oj is %0.1f times faster than YAJL at parsing." % [yajl_dt / oj_dt]
|
61
41
|
|
42
|
+
|
43
|
+
obj = Oj.load(s)
|
62
44
|
start = Time.now
|
63
45
|
iter.times do
|
64
46
|
Oj.dump(obj)
|
65
47
|
end
|
66
|
-
|
67
|
-
puts "%d Oj.dump()s in %0.3f seconds or %0.1f dumps/msec" % [iter,
|
48
|
+
oj_dt = Time.now - start
|
49
|
+
puts "%d Oj.dump()s in %0.3f seconds or %0.1f dumps/msec" % [iter, oj_dt, iter/oj_dt/1000.0]
|
68
50
|
|
69
51
|
start = Time.now
|
70
52
|
iter.times do
|
71
53
|
Yajl::Encoder.encode(obj)
|
72
54
|
end
|
73
|
-
|
74
|
-
puts "%d Yajl::Encoder.encode()s in %0.3f seconds or %0.1f encodes/msec" % [iter,
|
55
|
+
yajl_dt = Time.now - start
|
56
|
+
puts "%d Yajl::Encoder.encode()s in %0.3f seconds or %0.1f encodes/msec" % [iter, yajl_dt, iter/yajl_dt/1000.0]
|
75
57
|
|
76
|
-
puts
|
58
|
+
puts "Oj is %0.1f times faster than YAJL at dumping." % [yajl_dt / oj_dt]
|
@@ -0,0 +1,137 @@
|
|
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
ADDED
@@ -0,0 +1,23 @@
|
|
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
ADDED
@@ -0,0 +1,54 @@
|
|
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
|
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.4
|
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-08-12 00:00:00.000000000 Z
|
13
13
|
dependencies: []
|
14
14
|
description: ! 'The fastest JSON parser and object serializer. '
|
15
15
|
email: peter@ohler.com
|
@@ -32,15 +32,17 @@ files:
|
|
32
32
|
- ext/oj/fast.c
|
33
33
|
- ext/oj/load.c
|
34
34
|
- ext/oj/oj.c
|
35
|
+
- test/boo.rb
|
36
|
+
- test/bug.rb
|
35
37
|
- test/files.rb
|
38
|
+
- test/foo.rb
|
39
|
+
- test/oj-test/test.rb
|
36
40
|
- test/perf.rb
|
37
|
-
- test/perf1.rb
|
38
|
-
- test/perf2.rb
|
39
41
|
- test/perf_fast.rb
|
40
42
|
- test/perf_obj.rb
|
41
|
-
- test/perf_obj_old.rb
|
42
43
|
- test/perf_simple.rb
|
43
44
|
- test/perf_strict.rb
|
45
|
+
- test/reddit.rb
|
44
46
|
- test/sample/change.rb
|
45
47
|
- test/sample/dir.rb
|
46
48
|
- test/sample/doc.rb
|
@@ -58,6 +60,7 @@ files:
|
|
58
60
|
- test/test_fast.rb
|
59
61
|
- test/test_mimic.rb
|
60
62
|
- test/tests.rb
|
63
|
+
- test/where.rb
|
61
64
|
- LICENSE
|
62
65
|
- README.md
|
63
66
|
homepage: http://www.ohler.com/oj
|
@@ -88,4 +91,3 @@ signing_key:
|
|
88
91
|
specification_version: 3
|
89
92
|
summary: A fast JSON parser and serializer.
|
90
93
|
test_files: []
|
91
|
-
has_rdoc: true
|
data/test/perf1.rb
DELETED
@@ -1,64 +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 '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/perf_obj_old.rb
DELETED
@@ -1,213 +0,0 @@
|
|
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
|