Skip to content

Commit 1b90498

Browse files
authored
Merge pull request #149 from bdewater/time-and-date-parsing
Add ISO8601 string parsing comparison for `Time` and `Date`
2 parents 9b74279 + a8a9e74 commit 1b90498

File tree

3 files changed

+79
-0
lines changed

3 files changed

+79
-0
lines changed

README.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,12 @@ Idioms
4646

4747
- [General](#general)
4848
- [Array](#array)
49+
- [Date](#date)
4950
- [Enumerable](#enumerable)
5051
- [Hash](#hash)
5152
- [Proc & Block](#proc--block)
5253
- [String](#string)
54+
- [Time](#time)
5355
- [Range](#range)
5456

5557
### General
@@ -629,6 +631,27 @@ Comparison:
629631
inject block: 14063.1 i/s - 1.35x slower
630632
```
631633

634+
### Date
635+
636+
##### `Date.iso8601` vs `Date.parse` [code](code/date/iso8601-vs-parse.rb)
637+
638+
When expecting well-formatted data from e.g. an API, `iso8601` is faster and will raise an `ArgumentError` on malformed input.
639+
640+
```
641+
$ ruby -v code/date/iso8601-vs-parse.rb
642+
ruby 2.4.3p205 (2017-12-14 revision 61247) [x86_64-darwin17]
643+
Warming up --------------------------------------
644+
Date.iso8601 28.880k i/100ms
645+
Date.parse 15.805k i/100ms
646+
Calculating -------------------------------------
647+
Date.iso8601 328.035k (± 4.7%) i/s - 1.646M in 5.029287s
648+
Date.parse 175.546k (± 3.8%) i/s - 885.080k in 5.049444s
649+
650+
Comparison:
651+
Date.iso8601: 328035.3 i/s
652+
Date.parse: 175545.9 i/s - 1.87x slower
653+
```
654+
632655
### Hash
633656

634657
##### `Hash#[]` vs `Hash#fetch` [code](code/hash/bracket-vs-fetch.rb)
@@ -1193,6 +1216,26 @@ Comparison:
11931216
String#gsub/regex+/: 14668.1 i/s - 25.42x slower
11941217
```
11951218

1219+
### Time
1220+
1221+
##### `Time.iso8601` vs `Time.parse` [code](code/time/iso8601-vs-parse.rb)
1222+
1223+
When expecting well-formatted data from e.g. an API, `iso8601` is faster and will raise an `ArgumentError` on malformed input.
1224+
1225+
```
1226+
$ ruby -v code/time/iso8601-vs-parse.rb
1227+
ruby 2.4.3p205 (2017-12-14 revision 61247) [x86_64-darwin17]
1228+
Warming up --------------------------------------
1229+
Time.iso8601 10.234k i/100ms
1230+
Time.parse 4.228k i/100ms
1231+
Calculating -------------------------------------
1232+
Time.iso8601 114.485k (± 3.5%) i/s - 573.104k in 5.012008s
1233+
Time.parse 43.711k (± 4.1%) i/s - 219.856k in 5.038349s
1234+
1235+
Comparison:
1236+
Time.iso8601: 114485.1 i/s
1237+
Time.parse: 43710.9 i/s - 2.62x slower
1238+
```
11961239

11971240
### Range
11981241

code/date/iso8601-vs-parse.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
require 'benchmark/ips'
2+
require 'date'
3+
4+
STRING = '2018-03-21'.freeze
5+
6+
def fast
7+
Date.iso8601(STRING)
8+
end
9+
10+
def slow
11+
Date.parse(STRING)
12+
end
13+
14+
Benchmark.ips do |x|
15+
x.report('Date.iso8601') { fast }
16+
x.report('Date.parse') { slow }
17+
x.compare!
18+
end

code/time/iso8601-vs-parse.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
require 'benchmark/ips'
2+
require 'time'
3+
4+
STRING = '2018-03-21T11:26:50Z'.freeze
5+
6+
def fast
7+
Time.iso8601(STRING)
8+
end
9+
10+
def slow
11+
Time.parse(STRING)
12+
end
13+
14+
Benchmark.ips do |x|
15+
x.report('Time.iso8601') { fast }
16+
x.report('Time.parse') { slow }
17+
x.compare!
18+
end

0 commit comments

Comments
 (0)