ox 1.4.6 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of ox might be problematic. Click here for more details.
- data/README.md +8 -2
- data/ext/ox/dump.c +129 -33
- data/ext/ox/gen_load.c +13 -13
- data/ext/ox/obj_load.c +21 -18
- data/ext/ox/ox.c +155 -158
- data/ext/ox/ox.h +48 -50
- data/ext/ox/parse.c +1 -1
- data/ext/ox/sax.c +29 -29
- data/lib/ox/version.rb +1 -1
- data/test/files.rb +4 -9
- data/test/func.rb +33 -0
- data/test/perf.rb +91 -0
- data/test/perf_obj.rb +61 -138
- data/test/sample.rb +9 -16
- data/test/sample/change.rb +14 -0
- data/test/sample/dir.rb +19 -0
- data/test/sample/doc.rb +36 -0
- data/test/sample/file.rb +48 -0
- data/test/sample/group.rb +16 -0
- data/test/sample/hasprops.rb +16 -0
- data/test/sample/layer.rb +12 -0
- data/test/sample/line.rb +20 -0
- data/test/sample/oval.rb +10 -0
- data/test/sample/rect.rb +10 -0
- data/test/sample/shape.rb +35 -0
- data/test/sample/text.rb +20 -0
- metadata +16 -2
data/test/perf_obj.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby -wW1
|
2
2
|
|
3
3
|
$: << '.'
|
4
|
-
$: << '..'
|
5
4
|
$: << '../lib'
|
6
5
|
$: << '../ext'
|
7
6
|
|
@@ -14,13 +13,13 @@ end
|
|
14
13
|
|
15
14
|
require 'optparse'
|
16
15
|
require 'ox'
|
16
|
+
require 'oj'
|
17
|
+
require 'perf'
|
17
18
|
require 'sample'
|
18
|
-
require 'test/ox/doc'
|
19
19
|
require 'files'
|
20
20
|
|
21
|
-
$verbose = 0
|
22
|
-
$ox_only = false
|
23
21
|
$circular = false
|
22
|
+
$indent = 0
|
24
23
|
|
25
24
|
do_sample = false
|
26
25
|
do_files = false
|
@@ -32,9 +31,6 @@ do_write = false
|
|
32
31
|
$iter = 1000
|
33
32
|
|
34
33
|
opts = OptionParser.new
|
35
|
-
opts.on("-v", "increase verbosity") { $verbose += 1 }
|
36
|
-
|
37
|
-
opts.on("-x", "ox only") { $ox_only = true }
|
38
34
|
opts.on("-c", "circular options") { $circular = true }
|
39
35
|
|
40
36
|
opts.on("-s", "load and dump as sample Ruby object") { do_sample = true }
|
@@ -51,151 +47,78 @@ opts.on("-i", "--iterations [Int]", Integer, "iterations") { |i| $iter = i }
|
|
51
47
|
opts.on("-h", "--help", "Show this display") { puts opts; Process.exit!(0) }
|
52
48
|
files = opts.parse(ARGV)
|
53
49
|
|
50
|
+
$obj = nil
|
51
|
+
$xml = nil
|
52
|
+
$mars = nil
|
53
|
+
$json = nil
|
54
|
+
|
55
|
+
unless do_load || do_dump || do_read || do_write
|
56
|
+
do_load = true
|
57
|
+
do_dump = true
|
58
|
+
do_read = true
|
59
|
+
do_write = true
|
60
|
+
end
|
61
|
+
|
62
|
+
# prepare all the formats for input
|
54
63
|
if files.empty?
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
File.open('sample.xml', 'w') { |f| f.write(xml) }
|
60
|
-
File.open('sample.
|
61
|
-
|
64
|
+
$obj = do_sample ? sample_doc(2) : files('..')
|
65
|
+
$mars = Marshal.dump($obj)
|
66
|
+
$xml = Ox.dump($obj, :indent => $indent, circular: $circular)
|
67
|
+
$json = Oj.dump($obj, :indent => $indent, circular: $circular)
|
68
|
+
File.open('sample.xml', 'w') { |f| f.write($xml) }
|
69
|
+
File.open('sample.json', 'w') { |f| f.write($json) }
|
70
|
+
File.open('sample.marshal', 'w') { |f| f.write($mars) }
|
62
71
|
else
|
63
72
|
puts "loading and parsing #{files}\n\n"
|
73
|
+
# TBD change to allow xml and json
|
64
74
|
data = files.map do |f|
|
65
|
-
xml = File.read(f)
|
66
|
-
obj = Ox.load(xml);
|
67
|
-
mars = Marshal.dump(obj)
|
68
|
-
|
75
|
+
$xml = File.read(f)
|
76
|
+
$obj = Ox.load($xml);
|
77
|
+
$mars = Marshal.dump($obj)
|
78
|
+
$json = Oj.dump($obj, :indent => $indent, circular: $circular)
|
69
79
|
end
|
70
80
|
end
|
71
81
|
|
72
|
-
|
73
|
-
$mars_load_time = 0
|
74
|
-
$ox_dump_time = 0
|
75
|
-
$mars_dump_time = 0
|
76
|
-
|
77
|
-
def perf_load(d)
|
78
|
-
filename = d[:file]
|
79
|
-
marshal_filename = 'sample.marshal'
|
80
|
-
xml = d[:xml]
|
81
|
-
mars = d[:marshal]
|
82
|
+
Oj.default_options = { :mode => :object, :indent => $indent }
|
82
83
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
(
|
89
|
-
|
90
|
-
|
91
|
-
$ox_load_time = Time.now - start
|
92
|
-
puts "Parsing #{$iter} times with Ox took #{$ox_load_time} seconds."
|
93
|
-
|
94
|
-
return if $ox_only
|
95
|
-
|
96
|
-
start = Time.now
|
97
|
-
(1..$iter).each do
|
98
|
-
obj = Marshal.load(mars)
|
99
|
-
end
|
100
|
-
$mars_load_time = Time.now - start
|
101
|
-
puts "Marshalling #{$iter} times took #{$mars_load_time} seconds."
|
102
|
-
puts ">>> Ox is %0.1f faster than Marshal loading.\n\n" % [$mars_load_time/$ox_load_time]
|
84
|
+
if do_load
|
85
|
+
puts '-' * 80
|
86
|
+
puts "Load Performance"
|
87
|
+
perf = Perf.new()
|
88
|
+
perf.add('Ox', 'load') { Ox.load($xml, :mode => :object) }
|
89
|
+
perf.add('Oj', 'load') { Oj.load($json) }
|
90
|
+
perf.add('Marshal', 'load') { Marshal.load($mars) }
|
91
|
+
perf.run($iter)
|
103
92
|
end
|
104
93
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
(
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
$ox_dump_time = Time.now - start
|
114
|
-
puts "Ox dumping #{$iter} times with ox took #{$ox_dump_time} seconds."
|
115
|
-
|
116
|
-
return if $ox_only
|
117
|
-
|
118
|
-
obj = d[:obj]
|
119
|
-
start = Time.now
|
120
|
-
(1..$iter).each do
|
121
|
-
m = Marshal.dump(obj)
|
122
|
-
end
|
123
|
-
$mars_dump_time = Time.now - start
|
124
|
-
puts "Marshal dumping #{$iter} times took #{$mars_dump_time} seconds."
|
125
|
-
puts ">>> Ox is %0.1f faster than Marshal dumping.\n\n" % [$mars_dump_time/$ox_dump_time]
|
94
|
+
if do_dump
|
95
|
+
puts '-' * 80
|
96
|
+
puts "Dump Performance"
|
97
|
+
perf = Perf.new()
|
98
|
+
perf.add('Ox', 'dump') { Ox.dump($obj, :indent => $indent, :circular => $circular) }
|
99
|
+
perf.add('Oj', 'dump') { Oj.dump($obj) }
|
100
|
+
perf.add('Marshal', 'dump') { Marshal.dump($obj) }
|
101
|
+
perf.run($iter)
|
126
102
|
end
|
127
103
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
# now load from the file
|
138
|
-
start = Time.now
|
139
|
-
(1..$iter).each do
|
140
|
-
obj = Ox.load_file(filename, :mode => :object)
|
141
|
-
end
|
142
|
-
ox_read_time = Time.now - start
|
143
|
-
puts "Loading and parsing #{$iter} times with ox took #{ox_read_time} seconds."
|
144
|
-
|
145
|
-
if !$ox_only
|
146
|
-
start = Time.now
|
147
|
-
(1..$iter).each do
|
148
|
-
m = File.read(marshal_filename)
|
149
|
-
obj = Marshal.load(m)
|
150
|
-
end
|
151
|
-
mars_read_time = Time.now - start
|
152
|
-
puts "Reading and marshalling #{$iter} times took #{mars_read_time} seconds."
|
153
|
-
puts ">>> Ox is %0.1f faster than Marshal loading and parsing.\n\n" % [mars_read_time/ox_read_time]
|
154
|
-
|
155
|
-
end
|
104
|
+
if do_read
|
105
|
+
puts '-' * 80
|
106
|
+
puts "Read from file Performance"
|
107
|
+
perf = Perf.new()
|
108
|
+
perf.add('Ox', 'load_file') { Ox.load_file('sample.xml', :mode => :object) }
|
109
|
+
perf.add('Oj', 'load') { Oj.load_file('sample.json') }
|
110
|
+
perf.add('Marshal', 'load') { Marshal.load(File.new('sample.marshal')) }
|
111
|
+
perf.run($iter)
|
156
112
|
end
|
157
113
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
obj
|
165
|
-
|
166
|
-
start = Time.now
|
167
|
-
(1..$iter).each do
|
168
|
-
xml = Ox.to_file(ox_filename, obj, :indent => 0)
|
169
|
-
end
|
170
|
-
ox_write_time = Time.now - start
|
171
|
-
puts "Ox dumping #{$iter} times with ox took #{ox_write_time} seconds."
|
172
|
-
|
173
|
-
if !$ox_only
|
174
|
-
start = Time.now
|
175
|
-
(1..$iter).each do
|
176
|
-
m = Marshal.dump(obj, circular: $circular)
|
177
|
-
File.open(marshal_filename, "w") { |f| f.write(m) }
|
178
|
-
end
|
179
|
-
mars_write_time = Time.now - start
|
180
|
-
puts "Marshal dumping and writing #{$iter} times took #{mars_write_time} seconds."
|
181
|
-
puts ">>> Ox is %0.1f faster than Marshal dumping.\n\n" % [mars_write_time/ox_write_time]
|
182
|
-
|
183
|
-
end
|
114
|
+
if do_write
|
115
|
+
puts '-' * 80
|
116
|
+
puts "Write to file Performance"
|
117
|
+
perf = Perf.new()
|
118
|
+
perf.add('Ox', 'to_file') { Ox.to_file('sample.xml', $obj, :indent => $indent, :circular => $circular) }
|
119
|
+
perf.add('Oj', 'to_file') { Oj.to_file('sample.json', $obj) }
|
120
|
+
perf.add('Marshal', 'dump') { Marshal.dump($obj, File.new('sample.marshal', 'w')) }
|
121
|
+
perf.run($iter)
|
184
122
|
end
|
185
123
|
|
186
|
-
#if do_sample or do_files
|
187
|
-
data.each do |d|
|
188
|
-
puts "Using file #{d[:file]}."
|
189
|
-
|
190
|
-
perf_load(d) if do_load
|
191
|
-
perf_dump(d) if do_dump
|
192
|
-
if do_load and do_dump
|
193
|
-
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
|
194
|
-
end
|
195
|
-
|
196
|
-
perf_read(d) if do_read
|
197
|
-
perf_write(d) if do_write
|
198
|
-
|
199
|
-
end
|
200
|
-
#end
|
201
124
|
|
data/test/sample.rb
CHANGED
@@ -8,14 +8,13 @@ if $0 == __FILE__
|
|
8
8
|
end
|
9
9
|
|
10
10
|
require 'pp'
|
11
|
-
require '
|
12
|
-
require 'test/ox/doc'
|
11
|
+
require 'sample/doc'
|
13
12
|
|
14
13
|
|
15
14
|
def sample_doc(size=3)
|
16
15
|
colors = [ :black, :gray, :white, :red, :blue, :yellow, :green, :purple, :orange ]
|
17
16
|
|
18
|
-
d = ::
|
17
|
+
d = ::Sample::Doc.new('Sample')
|
19
18
|
|
20
19
|
# add some history
|
21
20
|
(0..size * 10).each do |i|
|
@@ -24,21 +23,21 @@ def sample_doc(size=3)
|
|
24
23
|
|
25
24
|
# add some layers
|
26
25
|
(1..size).each do |i|
|
27
|
-
layer = ::
|
26
|
+
layer = ::Sample::Layer.new("Layer-#{i}")
|
28
27
|
(1..size).each do |j|
|
29
|
-
g = ::
|
28
|
+
g = ::Sample::Group.new
|
30
29
|
(1..size).each do |k|
|
31
|
-
g2 = ::
|
32
|
-
r = ::
|
30
|
+
g2 = ::Sample::Group.new
|
31
|
+
r = ::Sample::Rect.new(j * 40 + 10.0, i * 10.0,
|
33
32
|
10.123456 / k, 10.0 / k, colors[(i + j + k) % colors.size])
|
34
33
|
r.add_prop(:part_of, layer.name)
|
35
34
|
g2 << r
|
36
|
-
g2 << ::
|
35
|
+
g2 << ::Sample::Text.new("#{k} in #{j}", r.left, r.top, r.width, r.height)
|
37
36
|
g << g2
|
38
37
|
end
|
39
|
-
g2 = ::
|
38
|
+
g2 = ::Sample::Group.new
|
40
39
|
(1..size).each do |k|
|
41
|
-
o = ::
|
40
|
+
o = ::Sample::Oval.new(j * 40 + 12.0, i * 10.0 + 2.0,
|
42
41
|
6.0 / k, 6.0 / k, colors[(i + j + k) % colors.size])
|
43
42
|
o.add_prop(:inside, true)
|
44
43
|
g << o
|
@@ -52,11 +51,5 @@ def sample_doc(size=3)
|
|
52
51
|
# some properties
|
53
52
|
d.add_prop(:purpose, 'an example')
|
54
53
|
|
55
|
-
#pp d
|
56
|
-
#Ox.dump(d, :indent => 0)
|
57
54
|
d
|
58
55
|
end
|
59
|
-
|
60
|
-
if $0 == __FILE__
|
61
|
-
File.open('foo.xml', "w") { |f| f.write(Ox.dump(sample_doc(3), :indent => 2)) }
|
62
|
-
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
|
2
|
+
module Sample
|
3
|
+
class Change
|
4
|
+
attr_accessor :time
|
5
|
+
attr_accessor :user
|
6
|
+
attr_accessor :comment
|
7
|
+
|
8
|
+
def initialize(comment=nil, time=nil, user=nil)
|
9
|
+
@user = user || ENV['USER']
|
10
|
+
@time = time || Time.now
|
11
|
+
@comment = comment
|
12
|
+
end
|
13
|
+
end # Change
|
14
|
+
end # Sample
|
data/test/sample/dir.rb
ADDED
data/test/sample/doc.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
|
2
|
+
require 'sample/hasprops'
|
3
|
+
require 'sample/group'
|
4
|
+
require 'sample/layer'
|
5
|
+
require 'sample/line'
|
6
|
+
require 'sample/shape'
|
7
|
+
require 'sample/oval'
|
8
|
+
require 'sample/rect'
|
9
|
+
require 'sample/text'
|
10
|
+
require 'sample/change'
|
11
|
+
|
12
|
+
module Sample
|
13
|
+
class Doc
|
14
|
+
include HasProps
|
15
|
+
|
16
|
+
attr_accessor :title
|
17
|
+
attr_accessor :create_time
|
18
|
+
attr_accessor :user
|
19
|
+
# Hash of layers in the document indexed by layer name.
|
20
|
+
attr_reader :layers
|
21
|
+
attr_reader :change_history
|
22
|
+
|
23
|
+
def initialize(title)
|
24
|
+
@title = title
|
25
|
+
@user = ENV['USER']
|
26
|
+
@create_time = Time.now
|
27
|
+
@layers = { }
|
28
|
+
@change_history = []
|
29
|
+
end
|
30
|
+
|
31
|
+
def add_change(comment, time=nil, user=nil)
|
32
|
+
@change_history << Change.new(comment, time, user)
|
33
|
+
end
|
34
|
+
|
35
|
+
end # Doc
|
36
|
+
end # Sample
|
data/test/sample/file.rb
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
|
2
|
+
require 'etc'
|
3
|
+
|
4
|
+
module Sample
|
5
|
+
|
6
|
+
class File
|
7
|
+
attr_accessor :name, :ctime, :mtime, :size, :owner, :group, :permissions
|
8
|
+
|
9
|
+
def initialize(filename)
|
10
|
+
@name = ::File.basename(filename)
|
11
|
+
stat = ::File.stat(filename)
|
12
|
+
@ctime = stat.ctime
|
13
|
+
@mtime = stat.mtime
|
14
|
+
@size = stat.size
|
15
|
+
@owner = Etc.getpwuid(stat.uid).name
|
16
|
+
@group = Etc.getgrgid(stat.gid).name
|
17
|
+
if false
|
18
|
+
@permissions = {
|
19
|
+
'user' => {
|
20
|
+
'read' => (0 != (stat.mode & 0x0100)),
|
21
|
+
'write' => (0 != (stat.mode & 0x0080)),
|
22
|
+
'execute' => (0 != (stat.mode & 0x0040))},
|
23
|
+
'group' => {
|
24
|
+
'read' => (0 != (stat.mode & 0x0020)),
|
25
|
+
'write' => (0 != (stat.mode & 0x0010)),
|
26
|
+
'execute' => (0 != (stat.mode & 0x0008))},
|
27
|
+
'other' => {
|
28
|
+
'read' => (0 != (stat.mode & 0x0004)),
|
29
|
+
'write' => (0 != (stat.mode & 0x0002)),
|
30
|
+
'execute' => (0 != (stat.mode & 0x0001))}
|
31
|
+
}
|
32
|
+
else
|
33
|
+
@permissions = {
|
34
|
+
'user' => [(0 != (stat.mode & 0x0100)) ? 'r' : '-',
|
35
|
+
(0 != (stat.mode & 0x0080)) ? 'w' : '-',
|
36
|
+
(0 != (stat.mode & 0x0040)) ? 'x' : '-'].join(''),
|
37
|
+
'group' => [(0 != (stat.mode & 0x0020)) ? 'r' : '-',
|
38
|
+
(0 != (stat.mode & 0x0010)) ? 'w' : '-',
|
39
|
+
(0 != (stat.mode & 0x0008)) ? 'x' : '-'].join(''),
|
40
|
+
'other' => [(0 != (stat.mode & 0x0004)) ? 'r' : '-',
|
41
|
+
(0 != (stat.mode & 0x0002)) ? 'w' : '-',
|
42
|
+
(0 != (stat.mode & 0x0001)) ? 'x' : '-'].join('')
|
43
|
+
}
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end # File
|
48
|
+
end # Sample
|
@@ -0,0 +1,16 @@
|
|
1
|
+
|
2
|
+
module Sample
|
3
|
+
module HasProps
|
4
|
+
|
5
|
+
def add_prop(key, value)
|
6
|
+
@props = { } unless self.instance_variable_defined?(:@props)
|
7
|
+
@props[key] = value
|
8
|
+
end
|
9
|
+
|
10
|
+
def props
|
11
|
+
@props = { } unless self.instance_variable_defined?(:@props)
|
12
|
+
@props
|
13
|
+
end
|
14
|
+
|
15
|
+
end # HasProps
|
16
|
+
end # Sample
|