home_run 0.9.0-x86-mingw32 → 0.9.1-x86-mingw32
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/CHANGELOG +46 -0
- data/README.rdoc +45 -33
- data/Rakefile +26 -67
- data/bench/cpu_bench.rb +1 -54
- data/bench/cpu_bench_util.rb +55 -0
- data/bench/parser_bench.rb +20 -0
- data/bin/home_run +14 -17
- data/default.mspec +1 -1
- data/ext/{date_ext.c → date_ext/date_ext.c} +95 -208
- data/ext/date_ext/date_ext.h +187 -0
- data/ext/date_ext/date_parser.c +852 -0
- data/ext/date_ext/date_parser.rl +352 -0
- data/ext/{datetime.c → date_ext/datetime.c} +120 -77
- data/ext/date_ext/extconf.rb +6 -0
- data/lib/1.8/date_ext.so +0 -0
- data/lib/1.9/date_ext.so +0 -0
- data/{ext → lib}/date/format.rb +1 -1
- data/lib/date.rb +7 -0
- data/lib/home_run.rb +5 -0
- data/spec/date/allocate_spec.rb +7 -0
- data/spec/date/encoding_spec.rb +42 -0
- data/spec/date/limits_spec.rb +121 -0
- data/spec/date/parse_spec.rb +154 -0
- data/spec/date/parsing_spec.rb +11 -0
- data/spec/date/step_spec.rb +22 -0
- data/spec/date/strptime_spec.rb +35 -3
- data/spec/datetime/add_spec.rb +4 -4
- data/spec/datetime/allocate_spec.rb +7 -0
- data/spec/datetime/encoding_spec.rb +42 -0
- data/spec/datetime/limits_spec.rb +170 -0
- data/spec/datetime/parse_spec.rb +73 -0
- data/spec/datetime/parsing_spec.rb +4 -0
- data/spec/datetime/step_spec.rb +22 -0
- data/spec/datetime/strptime_spec.rb +10 -0
- metadata +24 -14
- data/ext/1.8/date_ext.so +0 -0
- data/ext/1.9/date_ext.so +0 -0
- data/ext/date.rb +0 -7
- data/ext/date_parser.c +0 -367
- data/ext/date_parser.rl +0 -134
- data/ext/extconf.rb +0 -6
data/CHANGELOG
CHANGED
@@ -1,3 +1,49 @@
|
|
1
|
+
=== 0.9.1 (2010-09-01)
|
2
|
+
|
3
|
+
* Fix strptime for %Y%m%d and similar formats (jeremyevans) (#9)
|
4
|
+
|
5
|
+
* Require rake-compiler when building from source (may need to clean out your ext/date_ext directory manually) (jeremyevans)
|
6
|
+
|
7
|
+
* Include the ragel-generated file in the repository, so you don't need ragel to build from source (jeremyevans)
|
8
|
+
|
9
|
+
* Respect Encoding.default_internal for returned strings on 1.9 (brianmario, jeremyevans)
|
10
|
+
|
11
|
+
* Handle problems with zones in the -HH,DDD or -HH.DDD formats (jeremyevans)
|
12
|
+
|
13
|
+
* Compile C files separately, instead of including C files in other C files (jeremyevans)
|
14
|
+
|
15
|
+
* On ruby 1.9, return strings in US-ASCII encoding instead of ASCII-8BIT (jeremyevans) (#8)
|
16
|
+
|
17
|
+
* Reorganize directory structure to use the standard ruby extension structure (luislavena, jeremyevans)
|
18
|
+
|
19
|
+
* Support Date/DateTime#step without a block returning an Enumerator on 1.9 (jeremyevans) (#6)
|
20
|
+
|
21
|
+
* Support ruby build with CALC_EXACT_MALLOC_SIZE (nocode) (#5)
|
22
|
+
|
23
|
+
* Add Ragel parser for Apache Common Log Format date format (jeremyevans)
|
24
|
+
|
25
|
+
* Add Ragel parser for RFC 822 date format (jeremyevans)
|
26
|
+
|
27
|
+
* Fix loading date/format.rb directly where the date extension hasn't been included but the Date class has been opened (jeremyevans) (#3)
|
28
|
+
|
29
|
+
* Don't override ruby's default extension optimization flags (jeremyevans)
|
30
|
+
|
31
|
+
* Fix compilation on Solaris with the Sun Studio Compiler (ankopainting)
|
32
|
+
|
33
|
+
* Handle YYYY/MM/DD date format in the ISO 8601 Ragel parser (jeremyevans)
|
34
|
+
|
35
|
+
* Add a home_run.rb file to allow you to require 'home_run' to load the extension, useful on Heroku with ruby 1.8 (jeremyevans) (#2)
|
36
|
+
|
37
|
+
* Don't think that Mac OS X/Darwin users are on Windows (jeremyevans) (#1)
|
38
|
+
|
39
|
+
* Tighten up offset limits to exactly 14 hours from UTC (jeremyevans)
|
40
|
+
|
41
|
+
* Make dates outside of the allowed range raise RangeErrors (jeremyevans)
|
42
|
+
|
43
|
+
* Add range check for DateTime#+ and related methods (jeremyevans)
|
44
|
+
|
45
|
+
* Add range check for DateTime#new! (jeremyevans)
|
46
|
+
|
1
47
|
=== 0.9.0 (2010-08-20)
|
2
48
|
|
3
49
|
* Initial Public Release
|
data/README.rdoc
CHANGED
@@ -36,8 +36,8 @@ some comparative results for common methods:
|
|
36
36
|
The standard library Date class is slow enough to be the
|
37
37
|
bottleneck in much (if not most) of code that uses it.
|
38
38
|
Here's a real world benchmark showing the retrieval of
|
39
|
-
data from a database, first without home_run,
|
40
|
-
with home_run.
|
39
|
+
data from a database (using Sequel), first without home_run,
|
40
|
+
and then with home_run.
|
41
41
|
|
42
42
|
$ script/console production
|
43
43
|
Loading production environment (Rails 2.3.5)
|
@@ -109,10 +109,21 @@ using home_run:
|
|
109
109
|
This manipulates the RUBYLIB and RUBYOPT environment variables so
|
110
110
|
that home_run's Date/DateTime classes will be used.
|
111
111
|
|
112
|
+
You can also just require the library:
|
113
|
+
|
114
|
+
require 'home_run'
|
115
|
+
|
116
|
+
This should only be used as a last resort. Because rubygems requires
|
117
|
+
date, you can end up with situations where the Date instances created
|
118
|
+
before the require use the standard library version of Date, while the
|
119
|
+
Date instances created after the require use this library's version.
|
120
|
+
However, in some cases (such as on Heroku), this is the only way to
|
121
|
+
easily use this library.
|
122
|
+
|
112
123
|
== Running the specs
|
113
124
|
|
114
|
-
You can run the specs after installing the gem, if
|
115
|
-
installed (gem install mspec):
|
125
|
+
You can run the rubyspec based specs after installing the gem, if
|
126
|
+
you have MSpec installed (gem install mspec):
|
116
127
|
|
117
128
|
home_run --spec
|
118
129
|
|
@@ -202,6 +213,15 @@ you use the standard library.
|
|
202
213
|
Any other differences will either be documented here or considered
|
203
214
|
bugs, so please report any other differences you find.
|
204
215
|
|
216
|
+
== Known incompatibilities
|
217
|
+
|
218
|
+
Some other libraries are known to be incompatible with this
|
219
|
+
extension due to the above differences:
|
220
|
+
|
221
|
+
* Date::Performance - Date#<=> assumes @ajd instance variable
|
222
|
+
(unnecessary anyway, as home_run is faster)
|
223
|
+
* ruby-ole - Depends on DateTime.allocate/#initialize
|
224
|
+
|
205
225
|
== Reporting issues/bugs
|
206
226
|
|
207
227
|
home_run uses GitHub Issues for tracking issues/bugs:
|
@@ -220,25 +240,19 @@ To get a copy:
|
|
220
240
|
|
221
241
|
There are a few requirements:
|
222
242
|
|
223
|
-
*
|
224
|
-
*
|
225
|
-
included in the gem, so people installing the gem don't need
|
226
|
-
Ragel. The compiled C file is not checked into git, so you need
|
227
|
-
Ragel if you are working with a git checkout.
|
243
|
+
* rake
|
244
|
+
* rake-compiler
|
228
245
|
* MSpec (not RSpec) for running the specs. The specs are based on
|
229
246
|
the rubyspec specs, which is why they use MSpec.
|
230
247
|
* RDoc 2.5.10+ if you want to build the documentation.
|
248
|
+
* Ragel 6.5+ if you want to modify the ragel parser.
|
231
249
|
|
232
|
-
|
233
|
-
lib directory and there are .rb files in the ext directory. This may
|
234
|
-
change in a future version.
|
235
|
-
|
236
|
-
== Building
|
250
|
+
== Compiling
|
237
251
|
|
238
|
-
To
|
252
|
+
To compile the library from a git checkout, after installing the
|
239
253
|
requirements:
|
240
254
|
|
241
|
-
rake
|
255
|
+
rake compile
|
242
256
|
|
243
257
|
== Testing
|
244
258
|
|
@@ -246,7 +260,8 @@ The default rake task runs the specs, so just run:
|
|
246
260
|
|
247
261
|
rake
|
248
262
|
|
249
|
-
You need to
|
263
|
+
You need to compile the library and install MSpec before running the
|
264
|
+
specs.
|
250
265
|
|
251
266
|
== Benchmarking
|
252
267
|
|
@@ -275,18 +290,23 @@ home_run has been tested on the following:
|
|
275
290
|
=== Operating Systems/Platforms
|
276
291
|
|
277
292
|
* Linux (x86_64, i386)
|
278
|
-
* Mac OS X 10.6 (x86_64, i386)
|
293
|
+
* Mac OS X 10.6 (x86_64, i386), 10.5 (i386)
|
279
294
|
* OpenBSD (amd64, i386)
|
295
|
+
* Solaris 10 (sparc)
|
280
296
|
* Windows XP (i386)
|
297
|
+
* Windows 7 (x64)
|
281
298
|
|
282
299
|
=== Compiler Versions
|
283
300
|
|
284
|
-
* gcc (3.3.5, 4.2.1, 4.4.3, 4.5.0)
|
301
|
+
* gcc (3.3.5, 4.0.1, 4.2.1, 4.4.3, 4.5.0)
|
302
|
+
* Sun Studio Compiler (5.9)
|
285
303
|
|
286
304
|
=== Ruby Versions
|
287
305
|
|
306
|
+
* jruby cext branch (as of commit 1969c504229bfd6f2de1, 2010-08-23,
|
307
|
+
compiles and runs specs correctly, segfaults on benchmarks)
|
288
308
|
* rbx head (as of commit 0e265b92727cf3536053, 2010-08-16)
|
289
|
-
* ruby 1.8.6 (p0, p398, p399)
|
309
|
+
* ruby 1.8.6 (p0, p110, p398, p399)
|
290
310
|
* ruby 1.8.7 (p174, p248, p299, p302)
|
291
311
|
* ruby 1.9.1 (p243, p378, p429, p430)
|
292
312
|
* ruby 1.9.2 (p0)
|
@@ -295,19 +315,11 @@ home_run has been tested on the following:
|
|
295
315
|
If your platform, compiler version, or ruby version is not listed
|
296
316
|
above, please test and send me a report including:
|
297
317
|
|
298
|
-
* Your operating system and platform (e.g. i386, x86_64/amd64)
|
299
|
-
* Your compiler
|
300
|
-
* Your ruby version
|
301
|
-
* The output of home_run --spec
|
302
|
-
* The output of home_run --bench
|
303
|
-
|
304
|
-
== Todo
|
305
|
-
|
306
|
-
* Get it working on jruby with the cext branch
|
307
|
-
* Add more specs for greater code coverage and to test
|
308
|
-
boundry conditions
|
309
|
-
* Expand main ragel parser to handle more formats
|
310
|
-
* Add ragel versions of the 1.9 date parsing functions
|
318
|
+
* Your operating system and platform (e.g. i386, x86_64/amd64)
|
319
|
+
* Your compiler
|
320
|
+
* Your ruby version
|
321
|
+
* The output of home_run --spec
|
322
|
+
* The output of home_run --bench
|
311
323
|
|
312
324
|
== Author
|
313
325
|
|
data/Rakefile
CHANGED
@@ -2,20 +2,16 @@ require "rake"
|
|
2
2
|
require "rake/clean"
|
3
3
|
require 'rbconfig'
|
4
4
|
|
5
|
-
CLEAN.include %w'
|
5
|
+
CLEAN.include %w'**/*.rbc *.core rdoc coverage'
|
6
6
|
RUBY=ENV['RUBY'] || File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
require '
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
'home_run: Fast Date/DateTime classes for ruby', '--main', 'README.rdoc']
|
16
|
-
rdoc.rdoc_files.add %w"README.rdoc CHANGELOG LICENSE ext/**/*.rb ext/*.c"
|
17
|
-
end
|
18
|
-
rescue LoadError
|
8
|
+
desc "Build the RDoc documentation"
|
9
|
+
task :rdoc do
|
10
|
+
require 'fileutils'
|
11
|
+
FileUtils.rm_rf('rdoc')
|
12
|
+
sh 'rdoc --quiet --line-numbers --inline-source --output rdoc --title ' \
|
13
|
+
'"home_run: Fast Date/DateTime classes for ruby" --main README.rdoc ' \
|
14
|
+
'README.rdoc CHANGELOG LICENSE lib/date.rb lib/date/format.rb ext/date_ext/*.c'
|
19
15
|
end
|
20
16
|
|
21
17
|
desc "Run the specs with mspec"
|
@@ -26,73 +22,31 @@ task :spec do
|
|
26
22
|
end
|
27
23
|
|
28
24
|
desc "Build the gem"
|
29
|
-
task :gem => [:
|
25
|
+
task :gem => [:distclean] do
|
30
26
|
sh %{gem build home_run.gemspec}
|
31
27
|
end
|
32
28
|
|
33
29
|
desc "Try to clean up everything"
|
34
30
|
task :distclean do
|
35
|
-
CLEAN.concat(%w'pkg home_run-*.gem
|
31
|
+
CLEAN.concat(%w'pkg home_run-*.gem lib/1.* tmp')
|
36
32
|
Rake::Task[:clean].invoke
|
37
33
|
end
|
38
34
|
|
39
|
-
if RUBY_PLATFORM !~ /win|w32/ and File.directory?(File.join(File.expand_path(ENV['HOME']), '.rake-compiler'))
|
40
35
|
begin
|
41
|
-
require
|
42
|
-
|
43
|
-
load('home_run.gemspec')
|
44
|
-
desc "Internal--cross compile the windows binary gem"
|
45
|
-
cross_platform = ENV['CROSS_PLATFORM'] || 'i386-mingw32'
|
46
|
-
Rake::ExtensionTask.new('date_ext', HOME_RUN_GEMSPEC) do |ext|
|
47
|
-
ext.name = 'date_ext'
|
48
|
-
ext.ext_dir = 'ext'
|
49
|
-
ext.lib_dir = 'ext'
|
50
|
-
ext.cross_compile = true
|
51
|
-
ext.cross_platform = cross_platform
|
52
|
-
ext.source_pattern = '*.c'
|
53
|
-
end
|
54
|
-
|
55
|
-
# FIXME: Incredibly hacky, should figure out how to get
|
56
|
-
# rake compiler to do this correctly
|
57
|
-
desc "Build the cross compiled windows binary gem"
|
58
|
-
task :windows_gem => [:clean, :parser] do
|
59
|
-
sh %{rm -rf tmp pkg home_run-*.gem ext/1.*}
|
60
|
-
system %{rake cross native gem}
|
61
|
-
unless File.directory?('pkg')
|
62
|
-
sh "cp ext/*.c tmp/#{cross_platform}/date_ext/1.8.6"
|
63
|
-
system %{rake cross native gem}
|
64
|
-
sh %{cp ext/*.c tmp/#{cross_platform}/date_ext/1.9.1}
|
65
|
-
system %{rake cross native gem}
|
66
|
-
sh %{rake cross native gem}
|
67
|
-
end
|
68
|
-
sh %{rm -rf home_run-*.gem tmp ext/1.*}
|
69
|
-
sh %{mv pkg/home_run-*.gem .}
|
70
|
-
sh %{rmdir pkg}
|
71
|
-
end
|
36
|
+
require 'rake/extensiontask'
|
37
|
+
Rake::ExtensionTask.new('date_ext')
|
72
38
|
rescue LoadError
|
73
39
|
end
|
74
|
-
end
|
75
40
|
|
76
|
-
desc "
|
41
|
+
desc "Regenerate the ragel parser"
|
77
42
|
task :parser do
|
78
|
-
sh %{cd ext && ragel date_parser.rl}
|
79
|
-
end
|
80
|
-
|
81
|
-
desc "Build the extension"
|
82
|
-
task :build=>[:clean] do
|
83
|
-
sh %{cd ext && #{RUBY} extconf.rb && make}
|
84
|
-
end
|
85
|
-
|
86
|
-
desc "Build debug version of extension"
|
87
|
-
task :build_debug=>[:clean] do
|
88
|
-
ENV['DEBUG'] = '1'
|
89
|
-
sh %{cd ext && #{RUBY} extconf.rb && make}
|
43
|
+
sh %{cd ext/date_ext && ragel date_parser.rl}
|
90
44
|
end
|
91
45
|
|
92
46
|
desc "Start an IRB shell using the extension"
|
93
47
|
task :irb do
|
94
48
|
irb = ENV['IRB'] || File.join(RbConfig::CONFIG['bindir'], File.basename(RUBY).sub('ruby', 'irb'))
|
95
|
-
sh %{#{irb} -I
|
49
|
+
sh %{#{irb} -I lib -r date}
|
96
50
|
end
|
97
51
|
|
98
52
|
desc "Run comparative benchmarks"
|
@@ -103,34 +57,39 @@ end
|
|
103
57
|
desc "Run all benchmarks"
|
104
58
|
task :bench_all => [:bench, :mem_bench, :garbage_bench]
|
105
59
|
|
60
|
+
desc "Run comparative parser benchmarks"
|
61
|
+
task :parser_bench do
|
62
|
+
sh %{#{RUBY} bench/parser_bench.rb}
|
63
|
+
end
|
64
|
+
|
106
65
|
desc "Run comparative memory benchmarks"
|
107
66
|
task :mem_bench do
|
108
|
-
if RUBY_PLATFORM =~ /
|
67
|
+
if RUBY_PLATFORM =~ /mswin|mingw/
|
109
68
|
puts "Memory benchmarks not supported on Windows"
|
110
69
|
next
|
111
70
|
end
|
112
71
|
|
113
72
|
stdlib = `#{RUBY} -I #{RbConfig::CONFIG['rubylibdir']} bench/mem_bench.rb`.to_i
|
114
|
-
home_run = `#{RUBY} -I
|
73
|
+
home_run = `#{RUBY} -I lib bench/mem_bench.rb`.to_i
|
115
74
|
puts "Date memory use,#{stdlib}KB,#{home_run}KB,#{sprintf('%0.1f', stdlib/home_run.to_f)}"
|
116
75
|
|
117
76
|
stdlib = `#{RUBY} -I #{RbConfig::CONFIG['rubylibdir']} bench/dt_mem_bench.rb`.to_i
|
118
|
-
home_run = `#{RUBY} -I
|
77
|
+
home_run = `#{RUBY} -I lib bench/dt_mem_bench.rb`.to_i
|
119
78
|
puts "DateTime memory use,#{stdlib}KB,#{home_run}KB,#{sprintf('%0.1f', stdlib/home_run.to_f)}"
|
120
79
|
end
|
121
80
|
|
122
81
|
desc "Run comparative garbage creation benchmarks"
|
123
82
|
task :garbage_bench do
|
124
|
-
if RUBY_PLATFORM =~ /
|
83
|
+
if RUBY_PLATFORM =~ /mswin|mingw/
|
125
84
|
puts "Garbage creation benchmarks not supported on Windows"
|
126
85
|
next
|
127
86
|
end
|
128
87
|
|
129
88
|
stdlib = `#{RUBY} -I #{RbConfig::CONFIG['rubylibdir']} bench/garbage_bench.rb`.to_i
|
130
|
-
home_run = `#{RUBY} -I
|
89
|
+
home_run = `#{RUBY} -I lib bench/garbage_bench.rb`.to_i
|
131
90
|
puts "Date garbage created,#{stdlib}KB,#{home_run}KB,#{sprintf('%0.1f', stdlib/home_run.to_f)}"
|
132
91
|
|
133
92
|
stdlib = `#{RUBY} -I #{RbConfig::CONFIG['rubylibdir']} bench/dt_garbage_bench.rb`.to_i
|
134
|
-
home_run = `#{RUBY} -I
|
93
|
+
home_run = `#{RUBY} -I lib bench/dt_garbage_bench.rb`.to_i
|
135
94
|
puts "DateTime garbage created,#{stdlib}KB,#{home_run}KB,#{sprintf('%0.1f', stdlib/home_run.to_f)}"
|
136
95
|
end
|
data/bench/cpu_bench.rb
CHANGED
@@ -1,58 +1,5 @@
|
|
1
|
-
|
2
|
-
$:.unshift RbConfig::CONFIG['rubylibdir']
|
3
|
-
require 'date'
|
4
|
-
require 'benchmark'
|
5
|
-
|
6
|
-
SD = Date
|
7
|
-
SDT = DateTime
|
8
|
-
Object.send(:remove_const, :Date)
|
9
|
-
Object.send(:remove_const, :DateTime)
|
10
|
-
$:.unshift(File.join(File.dirname(File.dirname(File.expand_path(__FILE__))), 'ext'))
|
11
|
-
load 'ext/date.rb'
|
12
|
-
load 'ext/date/format.rb'
|
13
|
-
HRD = Date
|
14
|
-
HRDT = DateTime
|
15
|
-
NANOS_PER_SEC = 1000000000
|
16
|
-
N = 10000
|
17
|
-
FILTER = ARGV.empty? ? nil : Regexp.new(ARGV[0])
|
18
|
-
|
19
|
-
def compare(label, datetime=false, &block)
|
20
|
-
return if FILTER && label !~ FILTER
|
21
|
-
Object.send(:remove_const, :Date)
|
22
|
-
Object.send(:remove_const, :DateTime)
|
23
|
-
Object.send(:const_set, :Date, SD)
|
24
|
-
Object.send(:const_set, :DateTime, SDT)
|
25
|
-
stdlib = 0.0
|
26
|
-
stdlib_times = 0
|
27
|
-
while stdlib < 2
|
28
|
-
t = Time.now
|
29
|
-
yield(datetime ? SDT : SD)
|
30
|
-
stdlib += Time.now - t
|
31
|
-
stdlib_times += 1
|
32
|
-
end
|
33
|
-
|
34
|
-
Object.send(:remove_const, :Date)
|
35
|
-
Object.send(:remove_const, :DateTime)
|
36
|
-
Object.send(:const_set, :Date, HRD)
|
37
|
-
Object.send(:const_set, :DateTime, HRDT)
|
38
|
-
home_run = 0.0
|
39
|
-
home_run_times = 0
|
40
|
-
while home_run < 2
|
41
|
-
t = Time.now
|
42
|
-
yield(datetime ? HRDT : HRD)
|
43
|
-
home_run += Time.now - t
|
44
|
-
home_run_times += 1
|
45
|
-
end
|
46
|
-
|
47
|
-
puts sprintf('%s%s,%i,%i,%0.2f', datetime ? 'DateTime' : 'Date', label, (stdlib * NANOS_PER_SEC)/(N * stdlib_times), (home_run * NANOS_PER_SEC)/(N * home_run_times), (stdlib/stdlib_times)/(home_run/home_run_times))
|
48
|
-
end
|
49
|
-
|
50
|
-
def dt_compare(label, &block)
|
51
|
-
compare(label, true, &block)
|
52
|
-
end
|
53
|
-
|
1
|
+
load(File.join(File.dirname(File.expand_path(__FILE__)), 'cpu_bench_util.rb'))
|
54
2
|
n = N
|
55
|
-
puts "label,stdlib,home_run,times faster"
|
56
3
|
compare("._parse"){|dc| n.times{dc._parse('2010-12-13')}}
|
57
4
|
compare("._strptime"){|dc| n.times{dc._strptime('fri jan 5 00:00:00 2007', '%c')}}
|
58
5
|
compare(".civil"){|dc| n.times{dc.civil(2010, 1, 1)}}
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'rbconfig'
|
2
|
+
$:.unshift RbConfig::CONFIG['rubylibdir']
|
3
|
+
require 'date'
|
4
|
+
require 'benchmark'
|
5
|
+
|
6
|
+
SD = Date
|
7
|
+
SDT = DateTime
|
8
|
+
Object.send(:remove_const, :Date)
|
9
|
+
Object.send(:remove_const, :DateTime)
|
10
|
+
$:.unshift(File.join(File.dirname(File.dirname(File.expand_path(__FILE__))), 'lib'))
|
11
|
+
load 'lib/date.rb'
|
12
|
+
load 'lib/date/format.rb'
|
13
|
+
HRD = Date
|
14
|
+
HRDT = DateTime
|
15
|
+
NANOS_PER_SEC = 1000000000
|
16
|
+
N = ENV['N'] ? ENV['N'].to_i : 10000
|
17
|
+
S = ENV['S'] ? ENV['S'].to_f : 2
|
18
|
+
FILTER = ARGV.empty? ? nil : Regexp.new(ARGV[0])
|
19
|
+
|
20
|
+
def compare(label, datetime=false, &block)
|
21
|
+
return if FILTER && label !~ FILTER
|
22
|
+
Object.send(:remove_const, :Date)
|
23
|
+
Object.send(:remove_const, :DateTime)
|
24
|
+
Object.send(:const_set, :Date, SD)
|
25
|
+
Object.send(:const_set, :DateTime, SDT)
|
26
|
+
stdlib = 0.0
|
27
|
+
stdlib_times = 0
|
28
|
+
while stdlib < S
|
29
|
+
t = Time.now
|
30
|
+
yield(datetime ? SDT : SD)
|
31
|
+
stdlib += Time.now - t
|
32
|
+
stdlib_times += 1
|
33
|
+
end
|
34
|
+
|
35
|
+
Object.send(:remove_const, :Date)
|
36
|
+
Object.send(:remove_const, :DateTime)
|
37
|
+
Object.send(:const_set, :Date, HRD)
|
38
|
+
Object.send(:const_set, :DateTime, HRDT)
|
39
|
+
home_run = 0.0
|
40
|
+
home_run_times = 0
|
41
|
+
while home_run < S
|
42
|
+
t = Time.now
|
43
|
+
yield(datetime ? HRDT : HRD)
|
44
|
+
home_run += Time.now - t
|
45
|
+
home_run_times += 1
|
46
|
+
end
|
47
|
+
|
48
|
+
puts sprintf('%s%s,%i,%i,%0.2f', datetime ? 'DateTime' : 'Date', label, (stdlib * NANOS_PER_SEC)/(N * stdlib_times), (home_run * NANOS_PER_SEC)/(N * home_run_times), (stdlib/stdlib_times)/(home_run/home_run_times))
|
49
|
+
end
|
50
|
+
|
51
|
+
def dt_compare(label, &block)
|
52
|
+
compare(label, true, &block)
|
53
|
+
end
|
54
|
+
|
55
|
+
puts "label,stdlib,home_run,times faster"
|
@@ -0,0 +1,20 @@
|
|
1
|
+
load(File.join(File.dirname(File.expand_path(__FILE__)), 'cpu_bench_util.rb'))
|
2
|
+
n = N
|
3
|
+
formats = <<END
|
4
|
+
2010-12-13
|
5
|
+
2010-12-13 10:20:30
|
6
|
+
2010-12-13 10:20:30-07:00
|
7
|
+
2009/09/23
|
8
|
+
2009/09/23 06:38:06
|
9
|
+
23/Aug/2010
|
10
|
+
23/Aug/2010:14:31:32
|
11
|
+
23/Aug/2010:14:31:32 -0700
|
12
|
+
Mon, 23 Aug 2010
|
13
|
+
Mon, 23 Aug 2010 11:13:31
|
14
|
+
Mon, 23 Aug 2010 11:13:31 -0700
|
15
|
+
Mon, 23 Aug 2010 21:43:53 GMT
|
16
|
+
END
|
17
|
+
formats = formats.split("\n").map{|l| l.chomp}
|
18
|
+
formats.each do |f|
|
19
|
+
compare("._parse #{f.inspect}"){|dc| n.times{dc._parse(f)}}
|
20
|
+
end
|
data/bin/home_run
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'optparse'
|
4
|
+
require 'rbconfig'
|
4
5
|
|
5
6
|
command = :run
|
6
|
-
lib = File.expand_path(
|
7
|
+
lib = File.dirname(File.dirname(File.expand_path(__FILE__)))
|
7
8
|
|
8
9
|
opts = OptionParser.new do |opts|
|
9
10
|
opts.banner = "home_run: Fast Date/DateTime classes for ruby"
|
10
|
-
opts.define_head "Usage: home_run (--
|
11
|
+
opts.define_head "Usage: home_run (--option | command)"
|
11
12
|
opts.separator ""
|
12
13
|
opts.separator "Options:"
|
13
14
|
|
@@ -35,16 +36,14 @@ opts.order!
|
|
35
36
|
|
36
37
|
case command
|
37
38
|
when :bench
|
38
|
-
Dir.chdir(
|
39
|
-
require 'rbconfig'
|
39
|
+
Dir.chdir(lib)
|
40
40
|
ENV['RUBY'] = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
|
41
41
|
require 'rubygems'
|
42
42
|
require 'rake'
|
43
43
|
load './Rakefile'
|
44
44
|
Rake::Task[:bench_all].invoke
|
45
45
|
when :spec
|
46
|
-
Dir.chdir(
|
47
|
-
require 'rbconfig'
|
46
|
+
Dir.chdir(lib)
|
48
47
|
ENV['PATH'] = [RbConfig::CONFIG['bindir'], ENV['PATH']].join(File::PATH_SEPARATOR)
|
49
48
|
ENV['RUBY'] = File.join(RbConfig::CONFIG['ruby_install_name'])
|
50
49
|
require 'rubygems'
|
@@ -53,27 +52,25 @@ when :spec
|
|
53
52
|
Rake::Task[:default].invoke
|
54
53
|
when :install
|
55
54
|
Dir.chdir(lib)
|
56
|
-
require 'rbconfig'
|
57
55
|
require 'fileutils'
|
58
56
|
FUV = FileUtils::Verbose
|
59
|
-
FUV.cp("date.rb", RbConfig::CONFIG['sitelibdir'])
|
57
|
+
FUV.cp("lib/date.rb", RbConfig::CONFIG['sitelibdir'])
|
60
58
|
FUV.mkdir_p(File.join(RbConfig::CONFIG['sitelibdir'], 'date'))
|
61
|
-
FUV.cp("date/format.rb", File.join(RbConfig::CONFIG['sitelibdir'], 'date'))
|
62
|
-
if File.exists?("date_ext.#{RbConfig::CONFIG['DLEXT']}")
|
63
|
-
FUV.cp("date_ext.#{RbConfig::CONFIG['DLEXT']}", RbConfig::CONFIG['sitearchdir'])
|
59
|
+
FUV.cp("lib/date/format.rb", File.join(RbConfig::CONFIG['sitelibdir'], 'date'))
|
60
|
+
if File.exists?("lib/date_ext.#{RbConfig::CONFIG['DLEXT']}")
|
61
|
+
FUV.cp("lib/date_ext.#{RbConfig::CONFIG['DLEXT']}", RbConfig::CONFIG['sitearchdir'])
|
64
62
|
else
|
65
63
|
# Windows binary gem files
|
66
|
-
if File.exists?('1.8/date_ext.so')
|
64
|
+
if File.exists?('lib/1.8/date_ext.so')
|
67
65
|
FUV.mkdir_p(File.join(RbConfig::CONFIG['sitearchdir'], '1.8'))
|
68
|
-
FUV.cp("1.8/date_ext.so", File.join(RbConfig::CONFIG['sitearchdir'], '1.8'))
|
66
|
+
FUV.cp("lib/1.8/date_ext.so", File.join(RbConfig::CONFIG['sitearchdir'], '1.8'))
|
69
67
|
end
|
70
|
-
if File.exists?('1.9/date_ext.so')
|
68
|
+
if File.exists?('lib/1.9/date_ext.so')
|
71
69
|
FUV.mkdir_p(File.join(RbConfig::CONFIG['sitearchdir'], '1.9'))
|
72
|
-
FUV.cp("1.9/date_ext.so", File.join(RbConfig::CONFIG['sitearchdir'], '1.9'))
|
70
|
+
FUV.cp("lib/1.9/date_ext.so", File.join(RbConfig::CONFIG['sitearchdir'], '1.9'))
|
73
71
|
end
|
74
72
|
end
|
75
73
|
when :uninstall
|
76
|
-
require 'rbconfig'
|
77
74
|
require 'fileutils'
|
78
75
|
FUV = FileUtils::Verbose
|
79
76
|
FUV.rm_f(File.join(RbConfig::CONFIG['sitelibdir'], 'date.rb'))
|
@@ -86,6 +83,6 @@ when :uninstall
|
|
86
83
|
FUV.rmdir(File.join(RbConfig::CONFIG['sitearchdir'], '1.9')) rescue nil
|
87
84
|
else
|
88
85
|
ENV['RUBYOPT'] = "-rdate #{ENV['RUBYOPT']}"
|
89
|
-
ENV['RUBYLIB'] = [lib, ENV['RUBYLIB']].join(File::PATH_SEPARATOR)
|
86
|
+
ENV['RUBYLIB'] = [File.join(lib, 'lib'), File.join(lib, 'ext', 'date_ext'), ENV['RUBYLIB']].join(File::PATH_SEPARATOR)
|
90
87
|
exec(*ARGV)
|
91
88
|
end
|