external 0.1.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.
- data/History +5 -0
- data/MIT-LICENSE +21 -0
- data/README +168 -0
- data/lib/ext_arc.rb +108 -0
- data/lib/ext_arr.rb +727 -0
- data/lib/ext_ind.rb +1120 -0
- data/lib/external/base.rb +85 -0
- data/lib/external/chunkable.rb +105 -0
- data/lib/external/enumerable.rb +137 -0
- data/lib/external/io.rb +398 -0
- data/lib/external.rb +3 -0
- data/test/benchmarks/benchmarks_20070918.txt +45 -0
- data/test/benchmarks/benchmarks_20070921.txt +91 -0
- data/test/benchmarks/benchmarks_20071006.txt +147 -0
- data/test/benchmarks/test_copy_file.rb +80 -0
- data/test/benchmarks/test_pos_speed.rb +47 -0
- data/test/benchmarks/test_read_time.rb +55 -0
- data/test/cached_ext_ind_test.rb +219 -0
- data/test/check/benchmark_check.rb +441 -0
- data/test/check/namespace_conflicts_check.rb +23 -0
- data/test/check/pack_check.rb +90 -0
- data/test/ext_arc_test.rb +286 -0
- data/test/ext_arr/alt_sep.txt +3 -0
- data/test/ext_arr/cr_lf_input.txt +3 -0
- data/test/ext_arr/input.index +0 -0
- data/test/ext_arr/input.txt +1 -0
- data/test/ext_arr/inputb.index +0 -0
- data/test/ext_arr/inputb.txt +1 -0
- data/test/ext_arr/lf_input.txt +3 -0
- data/test/ext_arr/lines.txt +19 -0
- data/test/ext_arr/without_index.txt +1 -0
- data/test/ext_arr_test.rb +534 -0
- data/test/ext_ind_test.rb +1472 -0
- data/test/external/base_test.rb +74 -0
- data/test/external/chunkable_test.rb +182 -0
- data/test/external/index/input.index +0 -0
- data/test/external/index/inputb.index +0 -0
- data/test/external/io_test.rb +414 -0
- data/test/external_test_helper.rb +31 -0
- data/test/external_test_suite.rb +4 -0
- data/test/test_array.rb +1192 -0
- metadata +104 -0
data/lib/external/io.rb
ADDED
@@ -0,0 +1,398 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
require 'tempfile'
|
3
|
+
require 'external/chunkable'
|
4
|
+
|
5
|
+
module External
|
6
|
+
# Position gets IO objects to work properly for large files. Additionally,
|
7
|
+
# IO adds a length accessor for getting the size of the IO contents. Note
|
8
|
+
# that length is not automatically adjusted by write, for performance
|
9
|
+
# reasons. length must be managed manually, or reset after writes using
|
10
|
+
# reset_length.
|
11
|
+
#
|
12
|
+
# A variety of bugs needed to be addressed per-platform:
|
13
|
+
#
|
14
|
+
# == Mac OS X Tiger
|
15
|
+
#
|
16
|
+
# Using the default (broken) installation of Ruby, StringIO does not correctly
|
17
|
+
# position itself when a pos= statement is issued.
|
18
|
+
#
|
19
|
+
# s = StringIO.new "abc"
|
20
|
+
# s.read # => "abc"
|
21
|
+
# s.pos = 0
|
22
|
+
# s.read # => nil
|
23
|
+
#
|
24
|
+
# For regular IO objects, as expected, the second read statement returns
|
25
|
+
# "abc". Install the a fixed version of Ruby, perhaps with the one-click
|
26
|
+
# installer: http://rubyosx.rubyforge.org/
|
27
|
+
#
|
28
|
+
# == Windows
|
29
|
+
#
|
30
|
+
# Ruby on Windows has problems with files larger than ~2 gigabytes.
|
31
|
+
# Sizes return as negative, and positions cannot be set beyond the max
|
32
|
+
# size of a long (2147483647 ~ 2GB = 2475636895). IO corrects both of
|
33
|
+
# these issues thanks in large part to a bit of code taken from
|
34
|
+
# 'win32/file/stat' (http://rubyforge.org/projects/win32utils/).
|
35
|
+
#
|
36
|
+
# == Others
|
37
|
+
#
|
38
|
+
# I haven't found errors on Fedora and haven't tested on any other platforms.
|
39
|
+
# If you find and solve some wierd positioning errors, please let me know.
|
40
|
+
module IO
|
41
|
+
|
42
|
+
# Determines the generic mode of the input io using the _mode
|
43
|
+
# method for the input io class. By default IO provides _mode
|
44
|
+
# methods for File, Tempfile, and StringIO. The return string
|
45
|
+
# is determined as follows:
|
46
|
+
#
|
47
|
+
# readable & writable:: r+
|
48
|
+
# readable:: r
|
49
|
+
# writable:: w
|
50
|
+
#
|
51
|
+
# The _mode method takes the input io and should return an array
|
52
|
+
# specifying whether or not io is readable and writable
|
53
|
+
# (ie [readable, writable]).
|
54
|
+
#
|
55
|
+
# See try_handle for more details.
|
56
|
+
def self.mode(io)
|
57
|
+
readable, writable = try_handle(io, "mode")
|
58
|
+
|
59
|
+
case
|
60
|
+
when readable && writable then "r+"
|
61
|
+
when readable then "r"
|
62
|
+
when writable then "w"
|
63
|
+
else
|
64
|
+
# occurs for r+ mode, for some reason
|
65
|
+
"r+"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Determines the length of the input io using the _length method
|
70
|
+
# for the input io class. Non-External::IO inputs are extended
|
71
|
+
# in this process.
|
72
|
+
#
|
73
|
+
# The _length method takes the input io, and should return the
|
74
|
+
# current length of the input io (ie a flush operation may be
|
75
|
+
# required).
|
76
|
+
#
|
77
|
+
# See try_handle for more details.
|
78
|
+
def self.length(io)
|
79
|
+
case io
|
80
|
+
when External::IO
|
81
|
+
try_handle(io, "length")
|
82
|
+
else
|
83
|
+
io.extend External::IO
|
84
|
+
io.length
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# Returns an array of bools determining if the input File
|
89
|
+
# is readable and writable.
|
90
|
+
def self.file_mode(io)
|
91
|
+
begin
|
92
|
+
dup = io.dup
|
93
|
+
|
94
|
+
# determine readable/writable by sending close methods
|
95
|
+
# to the duplicated IO. If the io cannot be closed for
|
96
|
+
# read/write then it will raise an error, indicating that
|
97
|
+
# it was not open in the given mode.
|
98
|
+
[:close_read, :close_write].collect do |method|
|
99
|
+
begin
|
100
|
+
dup.send(method)
|
101
|
+
true
|
102
|
+
rescue(IOError)
|
103
|
+
false
|
104
|
+
end
|
105
|
+
end
|
106
|
+
ensure
|
107
|
+
# Be sure that the io is fully closed before proceeding!
|
108
|
+
# (Otherwise Tempfiles will not be properly disposed of
|
109
|
+
# ... at least on Windows, perhaps on others)
|
110
|
+
dup.close if dup && !dup.closed?
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# Returns the length of the input File
|
115
|
+
def self.file_length(io)
|
116
|
+
io.fsync unless io.generic_mode == 'r'
|
117
|
+
File.size(io.path)
|
118
|
+
end
|
119
|
+
|
120
|
+
# Returns an array of bools determining if the input Tempfile
|
121
|
+
# is readable and writable.
|
122
|
+
def self.tempfile_mode(io)
|
123
|
+
file_mode(io.instance_variable_get("@tmpfile"))
|
124
|
+
end
|
125
|
+
|
126
|
+
# Returns the length of the input Tempfile
|
127
|
+
def self.tempfile_length(io)
|
128
|
+
file_length(io)
|
129
|
+
end
|
130
|
+
|
131
|
+
# Returns an array of bools determining if the input StringIO
|
132
|
+
# is readable and writable.
|
133
|
+
#
|
134
|
+
# s = StringIO.new("abcde", "r+")
|
135
|
+
# External::IO.stringio_mode(s) # => [true, true]
|
136
|
+
#
|
137
|
+
def self.stringio_mode(io)
|
138
|
+
[!io.closed_read?, !io.closed_write?]
|
139
|
+
end
|
140
|
+
|
141
|
+
# Returns the length of the input StringIO
|
142
|
+
#
|
143
|
+
# s = StringIO.new("abcde", "r+")
|
144
|
+
# External::IO.length(s) # => 5
|
145
|
+
#
|
146
|
+
def self.stringio_length(io)
|
147
|
+
io.string.length
|
148
|
+
end
|
149
|
+
|
150
|
+
def self.extended(base) # :nodoc:
|
151
|
+
base.instance_variable_set("@generic_mode", mode(base))
|
152
|
+
base.reset_length
|
153
|
+
base.default_blksize = 1024
|
154
|
+
base.binmode
|
155
|
+
end
|
156
|
+
|
157
|
+
protected
|
158
|
+
|
159
|
+
# try_handle is a forwarding method allowing External::IO to handle
|
160
|
+
# non-File, non-Tempfile IO objects. try_handle infers a method
|
161
|
+
# name based on the class of the input and trys to forward the
|
162
|
+
# input io to that method within External::IO. For instance:
|
163
|
+
#
|
164
|
+
# * the _mode method for StringIO is 'stringio_mode'
|
165
|
+
# * the _length method for StringIO is 'stringio_length'
|
166
|
+
#
|
167
|
+
# Nested classes have '::' replaced by '_'. Thus to add support
|
168
|
+
# for Some::Unknown::IO, extend External::IO as below:
|
169
|
+
#
|
170
|
+
# module External::IO
|
171
|
+
# def some_unknown_io_mode(io)
|
172
|
+
# ...
|
173
|
+
# end
|
174
|
+
#
|
175
|
+
# def some_unknown_io_length(io)
|
176
|
+
# ...
|
177
|
+
# end
|
178
|
+
# end
|
179
|
+
#
|
180
|
+
# See stringio_mode and stringio_length for more details.
|
181
|
+
def self.try_handle(io, method)
|
182
|
+
method_name = io.class.to_s.downcase.gsub(/::/, "_") + "_#{method}"
|
183
|
+
if self.respond_to?(method_name)
|
184
|
+
External::IO.send(method_name, io)
|
185
|
+
else
|
186
|
+
raise "cannot determine #{method} for '%s'" % io.class
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
public
|
191
|
+
|
192
|
+
include Chunkable
|
193
|
+
attr_reader :generic_mode
|
194
|
+
|
195
|
+
# True if self is a File or Tempfile
|
196
|
+
def file?
|
197
|
+
self.kind_of?(File) || self.kind_of?(Tempfile)
|
198
|
+
end
|
199
|
+
|
200
|
+
# Modified truncate that adjusts length
|
201
|
+
def truncate(n)
|
202
|
+
super
|
203
|
+
self.pos = n if self.pos > n
|
204
|
+
self.length = n
|
205
|
+
end
|
206
|
+
|
207
|
+
# Resets length to the length returned by External::IO.length
|
208
|
+
def reset_length
|
209
|
+
self.length = External::IO.length(self)
|
210
|
+
end
|
211
|
+
|
212
|
+
#
|
213
|
+
# comparison
|
214
|
+
#
|
215
|
+
|
216
|
+
# Quick comparision with another IO. Returns true if
|
217
|
+
# another == self, or if both are file-type IOs and
|
218
|
+
# their paths are equal.
|
219
|
+
def quick_compare(another)
|
220
|
+
self == another || (self.file? && another.file? && self.path == another.path)
|
221
|
+
end
|
222
|
+
|
223
|
+
# Sort compare with another IO, behaving like a comparison between
|
224
|
+
# the full string contents of self and another. Can be a long
|
225
|
+
# operation if it requires the full read of two large IO objects.
|
226
|
+
def sort_compare(another, blksize=default_blksize)
|
227
|
+
# equal in comparison if the ios are equal
|
228
|
+
return 0 if quick_compare(another)
|
229
|
+
|
230
|
+
if another.length > self.length
|
231
|
+
return -1
|
232
|
+
elsif self.length < another.length
|
233
|
+
return 1
|
234
|
+
else
|
235
|
+
self.flush unless self.generic_mode == 'r'
|
236
|
+
self.pos = 0
|
237
|
+
another.flush unless another.generic_mode == 'r'
|
238
|
+
another.pos = 0
|
239
|
+
|
240
|
+
sa = sb = nil
|
241
|
+
while sa == sb
|
242
|
+
sa = self.read(blksize)
|
243
|
+
sb = another.read(blksize)
|
244
|
+
break if sa.nil? || sb.nil?
|
245
|
+
end
|
246
|
+
|
247
|
+
sa.to_s <=> sb.to_s
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
# Sort compare with another IO, behaving like a comparison between
|
252
|
+
# the full string contents of self and another. Can be a long
|
253
|
+
# operation if it requires the full read of two large IO objects.
|
254
|
+
def <=>(another)
|
255
|
+
sort_compare(another)
|
256
|
+
end
|
257
|
+
|
258
|
+
#
|
259
|
+
# reading
|
260
|
+
#
|
261
|
+
|
262
|
+
def scan(range_or_span=default_span, blksize=default_blksize, carryover_limit=default_blksize)
|
263
|
+
carryover = 0
|
264
|
+
chunk(range_or_span, blksize) do |offset, length|
|
265
|
+
raise "carryover exceeds limit: #{carryover} (#{carryover_limit})" if carryover > carryover_limit
|
266
|
+
|
267
|
+
scan_begin = offset - carryover
|
268
|
+
self.pos = scan_begin
|
269
|
+
string = self.read(length + carryover)
|
270
|
+
carryover = yield(scan_begin, string)
|
271
|
+
end
|
272
|
+
carryover
|
273
|
+
end
|
274
|
+
|
275
|
+
#
|
276
|
+
# writing
|
277
|
+
#
|
278
|
+
|
279
|
+
#
|
280
|
+
def insert(src, range=0..src.length, pos=nil)
|
281
|
+
self.pos = pos unless pos == nil
|
282
|
+
|
283
|
+
start_pos = self.pos
|
284
|
+
length_written = 0
|
285
|
+
|
286
|
+
src.flush unless src.generic_mode == 'r'
|
287
|
+
src.pos = range.begin
|
288
|
+
src.chunk(range) do |offset, length|
|
289
|
+
length_written += write(src.read(length))
|
290
|
+
end
|
291
|
+
|
292
|
+
end_pos = start_pos + length_written
|
293
|
+
self.length = end_pos if end_pos > self.length
|
294
|
+
length_written
|
295
|
+
end
|
296
|
+
|
297
|
+
#
|
298
|
+
def concat(src, range=0..src.length)
|
299
|
+
insert(src, range, length)
|
300
|
+
end
|
301
|
+
|
302
|
+
#--
|
303
|
+
# it appears that as long as the io opening t.path closes,
|
304
|
+
# the tempfile will be deleted at the exit of the ruby
|
305
|
+
# instance... otherwise it WILL NOT BE DELETED
|
306
|
+
# Make note of this in the documentation to be sure to close
|
307
|
+
# files if you start inserting because it may make tempfiles
|
308
|
+
#++
|
309
|
+
def copy(mode="r", range=0..length)
|
310
|
+
self.flush
|
311
|
+
|
312
|
+
temp = Tempfile.new("copy")
|
313
|
+
temp.extend IO
|
314
|
+
temp.insert(self, range)
|
315
|
+
temp.close
|
316
|
+
|
317
|
+
cp = File.open(temp.path, mode)
|
318
|
+
cp.extend IO
|
319
|
+
|
320
|
+
if block_given?
|
321
|
+
begin
|
322
|
+
yield(cp)
|
323
|
+
ensure
|
324
|
+
cp.close unless cp.closed?
|
325
|
+
FileUtils.rm(cp.path) if File.exists?(cp.path)
|
326
|
+
end
|
327
|
+
else
|
328
|
+
cp
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
# This code block modifies IO only if running on windows
|
336
|
+
unless RUBY_PLATFORM.index('mswin').nil?
|
337
|
+
require 'Win32API'
|
338
|
+
|
339
|
+
module External
|
340
|
+
module IO
|
341
|
+
# Modfied to properly determine file lengths on Windows. Uses code
|
342
|
+
# from 'win32/file/stat' (http://rubyforge.org/projects/win32utils/)
|
343
|
+
def self.file_length(io) # :nodoc:
|
344
|
+
io.fsync unless io.generic_mode == 'r'
|
345
|
+
|
346
|
+
# I would have liked to use win32/file/stat to do this... however, some issue
|
347
|
+
# arose involving FileUtils.cp, File.stat, and File::Stat.mode. cp raised an
|
348
|
+
# error because the mode would be nil for files. I wasn't sure how to fix it,
|
349
|
+
# so I've lifted the relevant code for pulling the large file size.
|
350
|
+
|
351
|
+
# Note this is a simplified version... if you base.path point to a chardev,
|
352
|
+
# this may need to be changed, because apparently the call to the Win32API
|
353
|
+
# may fail
|
354
|
+
|
355
|
+
stat_buf = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0].pack('ISSssssIILILILIL')
|
356
|
+
Win32API.new('msvcrt', '_stat64', 'PP', 'I').call(io.path, stat_buf)
|
357
|
+
stat_buf[24, 4].unpack('L').first # Size of file in bytes
|
358
|
+
end
|
359
|
+
|
360
|
+
POSITION_MAX = 2147483647 # maximum size of long
|
361
|
+
|
362
|
+
# Modified to handle positions past the 2Gb limit
|
363
|
+
def pos # :nodoc:
|
364
|
+
@pos || super
|
365
|
+
end
|
366
|
+
|
367
|
+
# Positions larger than the max value of a long cannot be directly given
|
368
|
+
# to the default +pos=+. This version incrementally seeks to positions
|
369
|
+
# beyond the maximum, if necessary.
|
370
|
+
#
|
371
|
+
# Note: setting the position beyond the 2Gb limit requires the use of a
|
372
|
+
# sysseek statement. As such, errors will arise if you try to position
|
373
|
+
# an IO object that does not support this method (for example StringIO...
|
374
|
+
# but then what are you doing with a 2Gb StringIO anyhow?)
|
375
|
+
def pos=(pos)
|
376
|
+
if pos < POSITION_MAX
|
377
|
+
super(pos)
|
378
|
+
@pos = nil
|
379
|
+
elsif @pos != pos
|
380
|
+
# note sysseek appears to be necessary here, rather than io.seek
|
381
|
+
@pos = pos
|
382
|
+
|
383
|
+
super(POSITION_MAX)
|
384
|
+
pos -= POSITION_MAX
|
385
|
+
|
386
|
+
while pos > POSITION_MAX
|
387
|
+
pos -= POSITION_MAX
|
388
|
+
self.sysseek(POSITION_MAX, Object::IO::SEEK_CUR)
|
389
|
+
end
|
390
|
+
|
391
|
+
self.sysseek(pos, Object::IO::SEEK_CUR)
|
392
|
+
end
|
393
|
+
end
|
394
|
+
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
end # end the windows-specific code
|
data/lib/external.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
############################################
|
2
|
+
# Index with batch processing
|
3
|
+
############################################
|
4
|
+
|
5
|
+
............
|
6
|
+
test_element_assignment_speed
|
7
|
+
user system total real
|
8
|
+
I
|
9
|
+
10kx [index]= 0.160000 0.050000 0.210000 ( 0.208374)
|
10
|
+
10kx [range]= 11.510000 13.240000 24.750000 ( 28.489626)
|
11
|
+
10kx [s,1]= 11.490000 13.010000 24.500000 ( 27.930727)
|
12
|
+
|
13
|
+
IIIIIIIIII
|
14
|
+
10kx [index]= 0.220000 0.050000 0.270000 ( 0.263851)
|
15
|
+
10kx [range]= 11.390000 13.790000 25.180000 ( 28.857814)
|
16
|
+
10kx [s,1]= 11.590000 13.920000 25.510000 ( 28.947041)
|
17
|
+
|
18
|
+
array reference
|
19
|
+
10kx [index]= 0.000000 0.000000 0.000000 ( 0.003049)
|
20
|
+
10kx [range]= 0.010000 0.000000 0.010000 ( 0.006701)
|
21
|
+
10kx [s,1]= 0.000000 0.000000 0.000000 ( 0.005084)
|
22
|
+
|
23
|
+
.
|
24
|
+
test_element_reference_speed
|
25
|
+
user system total real
|
26
|
+
I
|
27
|
+
100kx [index] 1.590000 0.640000 2.230000 ( 2.226855)
|
28
|
+
100kx [range] 0.670000 0.000000 0.670000 ( 0.674267)
|
29
|
+
100kx [s,1] 2.140000 0.710000 2.850000 ( 3.660551)
|
30
|
+
100kx [s,100] 11.110000 0.680000 11.790000 ( 11.797169)
|
31
|
+
|
32
|
+
IIIIIIIIII
|
33
|
+
100kx [index] 0.380000 0.000000 0.380000 ( 0.381269)
|
34
|
+
100kx [range] 0.590000 0.000000 0.590000 ( 0.596402)
|
35
|
+
100kx [s,1] 0.460000 0.000000 0.460000 ( 0.456065)
|
36
|
+
100kx [s,100] 0.440000 0.000000 0.440000 ( 0.438470)
|
37
|
+
|
38
|
+
array reference
|
39
|
+
100kx [index] 0.020000 0.000000 0.020000 ( 0.026224)
|
40
|
+
100kx [range] 0.080000 0.000000 0.080000 ( 0.079051)
|
41
|
+
100kx [s,1] 0.050000 0.000000 0.050000 ( 0.049507)
|
42
|
+
100kx [s,100] 0.050000 0.000000 0.050000 ( 0.050872)
|
43
|
+
|
44
|
+
..............
|
45
|
+
Finished in 135.398082 seconds.
|
@@ -0,0 +1,91 @@
|
|
1
|
+
#######################################
|
2
|
+
# reworked osx
|
3
|
+
#######################################
|
4
|
+
test_element_reference_speed
|
5
|
+
user system total real
|
6
|
+
I
|
7
|
+
100kx [index] 1.950000 0.660000 2.610000 ( 2.658425)
|
8
|
+
100kx [range] 2.880000 0.650000 3.530000 ( 3.573627)
|
9
|
+
100kx [s,1] 2.100000 0.640000 2.740000 ( 2.774918)
|
10
|
+
100kx [s,100] 20.810000 0.700000 21.510000 ( 21.615324)
|
11
|
+
|
12
|
+
IIIIIIIIII
|
13
|
+
100kx [index] 1.630000 0.360000 1.990000 ( 1.995421)
|
14
|
+
100kx [range] 1.140000 0.000000 1.140000 ( 1.145692)
|
15
|
+
100kx [s,1] 0.470000 0.000000 0.470000 ( 0.472543)
|
16
|
+
100kx [s,100] 0.470000 0.000000 0.470000 ( 0.472698)
|
17
|
+
|
18
|
+
array reference
|
19
|
+
100kx [index] 0.030000 0.000000 0.030000 ( 0.026341)
|
20
|
+
100kx [range] 0.060000 0.000000 0.060000 ( 0.060080)
|
21
|
+
100kx [s,1] 0.050000 0.000000 0.050000 ( 0.052237)
|
22
|
+
100kx [s,100] 0.040000 0.000000 0.040000 ( 0.042142)
|
23
|
+
|
24
|
+
#######################################
|
25
|
+
# reworked osx accelerated
|
26
|
+
#######################################
|
27
|
+
test_element_reference_speed
|
28
|
+
user system total real
|
29
|
+
I
|
30
|
+
100kx [index] 1.970000 0.650000 2.620000 ( 2.677882)
|
31
|
+
100kx [range] 2.870000 0.650000 3.520000 ( 3.530610)
|
32
|
+
100kx [s,1] 2.130000 0.640000 2.770000 ( 2.777566)
|
33
|
+
100kx [s,100] 8.410000 0.670000 9.080000 ( 9.118457)
|
34
|
+
|
35
|
+
IIIIIIIIII
|
36
|
+
100kx [index] 1.630000 0.360000 1.990000 ( 2.001829)
|
37
|
+
100kx [range] 1.150000 0.010000 1.160000 ( 1.157869)
|
38
|
+
100kx [s,1] 0.470000 0.000000 0.470000 ( 0.477857)
|
39
|
+
100kx [s,100] 0.470000 0.000000 0.470000 ( 0.476172)
|
40
|
+
|
41
|
+
array reference
|
42
|
+
100kx [index] 0.020000 0.000000 0.020000 ( 0.026329)
|
43
|
+
100kx [range] 0.060000 0.000000 0.060000 ( 0.060740)
|
44
|
+
100kx [s,1] 0.050000 0.000000 0.050000 ( 0.051872)
|
45
|
+
100kx [s,100] 0.040000 0.000000 0.040000 ( 0.043028)
|
46
|
+
|
47
|
+
..............................................................p. ..
|
48
|
+
|
49
|
+
#####################################
|
50
|
+
# with bulk processing only
|
51
|
+
#####################################
|
52
|
+
...........F..
|
53
|
+
test_element_assignment_speed
|
54
|
+
user system total real
|
55
|
+
I
|
56
|
+
10kx [index]= 0.190000 0.060000 0.250000 ( 0.278135)
|
57
|
+
10kx [range]= 12.760000 12.470000 25.230000 ( 40.200132)
|
58
|
+
10kx [s,1]= 12.740000 12.360000 25.100000 ( 40.450334)
|
59
|
+
|
60
|
+
IIIIIIIIII
|
61
|
+
10kx [index]= 0.240000 0.050000 0.290000 ( 0.287169)
|
62
|
+
10kx [range]= 12.410000 13.020000 25.430000 ( 40.168660)
|
63
|
+
10kx [s,1]= 12.510000 13.070000 25.580000 ( 40.690157)
|
64
|
+
|
65
|
+
array reference
|
66
|
+
10kx [index]= 0.000000 0.000000 0.000000 ( 0.003034)
|
67
|
+
10kx [range]= 0.010000 0.000000 0.010000 ( 0.007231)
|
68
|
+
10kx [s,1]= 0.000000 0.000000 0.000000 ( 0.005260)
|
69
|
+
|
70
|
+
.
|
71
|
+
test_element_reference_speed
|
72
|
+
user system total real
|
73
|
+
I
|
74
|
+
100kx [index] 1.740000 0.670000 2.410000 ( 2.414568)
|
75
|
+
100kx [range] 2.510000 0.660000 3.170000 ( 3.183513)
|
76
|
+
100kx [s,1] 1.920000 0.680000 2.600000 ( 3.314087)
|
77
|
+
100kx [s,100] 11.460000 0.730000 12.190000 ( 12.384289)
|
78
|
+
|
79
|
+
IIIIIIIIII
|
80
|
+
100kx [index] 1.420000 0.360000 1.780000 ( 1.785599)
|
81
|
+
100kx [range] 0.870000 0.000000 0.870000 ( 0.875749)
|
82
|
+
100kx [s,1] 0.330000 0.000000 0.330000 ( 0.326366)
|
83
|
+
100kx [s,100] 0.300000 0.000000 0.300000 ( 0.304128)
|
84
|
+
|
85
|
+
array reference
|
86
|
+
100kx [index] 0.030000 0.000000 0.030000 ( 0.025789)
|
87
|
+
100kx [range] 0.060000 0.000000 0.060000 ( 0.060912)
|
88
|
+
100kx [s,1] 0.040000 0.000000 0.040000 ( 0.042461)
|
89
|
+
100kx [s,100] 0.050000 0.000000 0.050000 ( 0.051094)
|
90
|
+
|
91
|
+
..................................F...
|
@@ -0,0 +1,147 @@
|
|
1
|
+
##########################################
|
2
|
+
# OSX before ASET optimizations
|
3
|
+
##########################################
|
4
|
+
|
5
|
+
test_array_methods
|
6
|
+
user system total real
|
7
|
+
1M << 0.290000 0.010000 0.300000 ( 0.300562)
|
8
|
+
1M [] 0.310000 0.000000 0.310000 ( 0.302214)
|
9
|
+
....
|
10
|
+
test_read_from_open_file
|
11
|
+
user system total real
|
12
|
+
1kx read from file 0.040000 0.200000 0.240000 ( 0.519244)
|
13
|
+
1kx file.read 0.140000 0.250000 0.390000 ( 0.395224)
|
14
|
+
.
|
15
|
+
test_read_in_chunk_vs_read_in_pieces
|
16
|
+
user system total real
|
17
|
+
1kx read in chunk 0.220000 0.160000 0.380000 ( 0.515190)
|
18
|
+
1kx read in pieces 0.620000 0.110000 0.730000 ( 0.728748)
|
19
|
+
1kx read in one block 0.050000 0.110000 0.160000 ( 0.160819)
|
20
|
+
1kx read in blocks 0.390000 0.110000 0.500000 ( 0.495172)
|
21
|
+
1kx File.read 0.160000 0.270000 0.430000 ( 0.438735)
|
22
|
+
.
|
23
|
+
test_read_into_arrays
|
24
|
+
user system total real
|
25
|
+
100x unpack to array 0.310000 0.030000 0.340000 ( 0.346243)
|
26
|
+
100x File.read.unpack 0.940000 0.060000 1.000000 ( 1.022879)
|
27
|
+
...
|
28
|
+
test_unpack_speed
|
29
|
+
user system total real
|
30
|
+
100x unpack 0.300000 0.000000 0.300000 ( 0.313970)
|
31
|
+
100x str.unpack 0.930000 0.020000 0.950000 ( 0.960535)
|
32
|
+
............................
|
33
|
+
test_element_assignment_speed_for_index
|
34
|
+
user system total real
|
35
|
+
I
|
36
|
+
1kx [index]= 0.010000 0.000000 0.010000 ( 0.011112)
|
37
|
+
1kx [range]= 0.020000 0.000000 0.020000 ( 0.014436)
|
38
|
+
1kx [s,1]= 0.000000 0.000000 0.000000 ( 0.007936)
|
39
|
+
|
40
|
+
IIIIIIIIII
|
41
|
+
1kx [index]= 0.010000 0.000000 0.010000 ( 0.012760)
|
42
|
+
1kx [range]= 0.020000 0.000000 0.020000 ( 0.014060)
|
43
|
+
1kx [s,1]= 0.000000 0.000000 0.000000 ( 0.007683)
|
44
|
+
|
45
|
+
array reference
|
46
|
+
1kx [index]= 0.000000 0.000000 0.000000 ( 0.000359)
|
47
|
+
1kx [range]= 0.010000 0.000000 0.010000 ( 0.001003)
|
48
|
+
1kx [s,1]= 0.000000 0.000000 0.000000 ( 0.000532)
|
49
|
+
|
50
|
+
.
|
51
|
+
test_element_reference_speed_for_index
|
52
|
+
user system total real
|
53
|
+
I
|
54
|
+
100kx [index] 0.170000 0.000000 0.170000 ( 0.170148)
|
55
|
+
100kx [range] 0.200000 0.000000 0.200000 ( 0.207506)
|
56
|
+
100kx [s,1] 0.210000 0.000000 0.210000 ( 0.206175)
|
57
|
+
100kx [s,10] 0.190000 0.000000 0.190000 ( 0.196211)
|
58
|
+
100kx [s,100] 0.210000 0.000000 0.210000 ( 0.207395)
|
59
|
+
|
60
|
+
IIIIIIIIII
|
61
|
+
100kx [index] 0.170000 0.000000 0.170000 ( 0.171383)
|
62
|
+
100kx [range] 0.220000 0.000000 0.220000 ( 0.218904)
|
63
|
+
100kx [s,1] 0.220000 0.000000 0.220000 ( 0.217726)
|
64
|
+
100kx [s,10] 0.220000 0.000000 0.220000 ( 0.227541)
|
65
|
+
100kx [s,100] 0.230000 0.010000 0.240000 ( 0.239500)
|
66
|
+
|
67
|
+
array reference
|
68
|
+
100kx [index] 0.030000 0.000000 0.030000 ( 0.026727)
|
69
|
+
100kx [range] 0.060000 0.000000 0.060000 ( 0.062518)
|
70
|
+
100kx [s,1] 0.040000 0.000000 0.040000 ( 0.043396)
|
71
|
+
100kx [s,10] 0.040000 0.000000 0.040000 ( 0.043224)
|
72
|
+
100kx [s,100] 0.040000 0.000000 0.040000 ( 0.043834)
|
73
|
+
|
74
|
+
................................................................
|
75
|
+
test_element_assignment_speed_for_ext_arr
|
76
|
+
user system total real
|
77
|
+
|
78
|
+
1kx [index]= 0.120000 0.010000 0.130000 ( 0.120187)
|
79
|
+
1kx [range]= 0.080000 0.000000 0.080000 ( 0.082323)
|
80
|
+
1kx [s,1]= 0.110000 0.010000 0.120000 ( 0.117434)
|
81
|
+
|
82
|
+
array reference
|
83
|
+
1kx [index]= 0.110000 0.000000 0.110000 ( 0.118859)
|
84
|
+
1kx [range]= 0.080000 0.010000 0.090000 ( 0.082343)
|
85
|
+
1kx [s,1]= 0.110000 0.010000 0.120000 ( 0.116168)
|
86
|
+
|
87
|
+
.
|
88
|
+
test_element_reference_speed_for_ext_arr
|
89
|
+
user system total real
|
90
|
+
|
91
|
+
10kx [index] 0.320000 0.130000 0.450000 ( 0.445001)
|
92
|
+
10kx [range] 0.450000 0.110000 0.560000 ( 0.567785)
|
93
|
+
10kx [s,1] 0.310000 0.070000 0.380000 ( 0.391895)
|
94
|
+
10kx [s,10] 2.490000 0.150000 2.640000 ( 2.669212)
|
95
|
+
|
96
|
+
array reference
|
97
|
+
10kx [index] 0.000000 0.000000 0.000000 ( 0.002583)
|
98
|
+
10kx [range] 0.010000 0.000000 0.010000 ( 0.004749)
|
99
|
+
10kx [s,1] 0.000000 0.000000 0.000000 ( 0.006787)
|
100
|
+
10kx [s,10] 0.000000 0.000000 0.000000 ( 0.003268)
|
101
|
+
|
102
|
+
....................................
|
103
|
+
test_element_assignment_speed_for_index
|
104
|
+
user system total real
|
105
|
+
I
|
106
|
+
1kx [index]= 0.020000 0.010000 0.030000 ( 0.026291)
|
107
|
+
1kx [range]= 5.400000 1.410000 6.810000 ( 8.220439)
|
108
|
+
1kx [s,1]= 5.620000 1.410000 7.030000 ( 8.293661)
|
109
|
+
|
110
|
+
IIIIIIIIII
|
111
|
+
1kx [index]= 0.020000 0.010000 0.030000 ( 0.029998)
|
112
|
+
1kx [range]= 5.880000 1.480000 7.360000 ( 8.588676)
|
113
|
+
1kx [s,1]= 5.580000 1.470000 7.050000 ( 8.308494)
|
114
|
+
|
115
|
+
array reference
|
116
|
+
1kx [index]= 0.000000 0.000000 0.000000 ( 0.000329)
|
117
|
+
1kx [range]= 0.000000 0.000000 0.000000 ( 0.000700)
|
118
|
+
1kx [s,1]= 0.000000 0.000000 0.000000 ( 0.000570)
|
119
|
+
|
120
|
+
.
|
121
|
+
test_element_reference_speed_for_index
|
122
|
+
user system total real
|
123
|
+
I
|
124
|
+
100kx [index] 1.950000 0.640000 2.590000 ( 2.598391)
|
125
|
+
100kx [range] 3.130000 0.650000 3.780000 ( 3.786401)
|
126
|
+
100kx [s,1] 2.390000 0.640000 3.030000 ( 3.029791)
|
127
|
+
100kx [s,10] 3.410000 0.650000 4.060000 ( 4.059696)
|
128
|
+
100kx [s,100] 11.250000 0.670000 11.920000 ( 11.970536)
|
129
|
+
|
130
|
+
IIIIIIIIII
|
131
|
+
100kx [index] 1.610000 0.360000 1.970000 ( 1.972972)
|
132
|
+
100kx [range] 1.070000 0.010000 1.080000 ( 1.080418)
|
133
|
+
100kx [s,1] 0.380000 0.000000 0.380000 ( 0.382648)
|
134
|
+
100kx [s,10] 0.380000 0.000000 0.380000 ( 0.383150)
|
135
|
+
100kx [s,100] 0.440000 0.000000 0.440000 ( 0.439358)
|
136
|
+
|
137
|
+
array reference
|
138
|
+
100kx [index] 0.020000 0.000000 0.020000 ( 0.026210)
|
139
|
+
100kx [range] 0.050000 0.000000 0.050000 ( 0.050129)
|
140
|
+
100kx [s,1] 0.040000 0.000000 0.040000 ( 0.033032)
|
141
|
+
100kx [s,10] 0.050000 0.000000 0.050000 ( 0.055461)
|
142
|
+
100kx [s,100] 0.040000 0.000000 0.040000 ( 0.032775)
|
143
|
+
|
144
|
+
.........................................................................p. ..
|
145
|
+
Finished in 82.428089 seconds.
|
146
|
+
|
147
|
+
216 tests, 5189 assertions, 0 failures, 0 errors
|