home_run 0.9.0-x86-mingw32 → 0.9.1-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- 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
|