rails/rails — pull request #17316 by igas (2014-10-19 10:53:18+00:00)
Title: Replace checking start/end of string

Replace `=~ /^str/`, `=~ /str$/`, `!~ /^str/`, and `!~ /str$/` to `start_with?` and `end_with?` when possible. Mostly it's 1,6x faster, some more impressive benchmarks:

**actionpack/lib/abstract_controller/helpers.rb**:

```ruby
Benchmark.ips do |x|
x.report('=~') { error.path =~ /^#{path}(\.rb)?$/ }
x.report('start/end') { error.path.start_with?(path) && error.path.end_with?('.rb', '') }
x.compare!
end
```

```
Calculating -------------------------------------
=~ 7097 i/100ms
start/end 29688 i/100ms
-------------------------------------------------
=~ 104752.3 (±8.3%) i/s - 525178 in 5.049548s
start/end 2423935.7 (±10.8%) i/s - 11964264 in 5.003489s

Comparison:
start/end: 2423935.7 i/s
=~: 104752.3 i/s - 23.14x slower
```

--

**actionpack/lib/action_dispatch/journey/visitors.rb**:

```
Benchmark.ips do |x|
x.report('=~') do
next unless pim =~ /^visit_(.*)$/
DISPATCH_CACHE[$1.to_sym] = pim
end
x.report('start/end') do
next unless pim.to_s.start_with?('visit_')
DISPATCH_CACHE[pim[/^visit_(.*)$/, 1].to_sym] = pim
end
x.compare!
end
```

```
Calculating -------------------------------------
=~ 58993 i/100ms
start/end 73946 i/100ms
-------------------------------------------------
=~ 1832025.8 (±6.6%) i/s - 9143915 in 5.012602s
start/end 2944646.4 (±8.2%) i/s - 14641308 in 5.006457s

Comparison:
start/end: 2944646.4 i/s
=~: 1832025.8 i/s - 1.61x slower
```

--

**actionview/lib/action_view/helpers/asset_tag_helper.rb**:

```ruby
Benchmark.ips do |x|
x.report('=~') { src =~ /^(?:cid|data):/ }
x.report('start/end') { src.start_with?('cid:', 'data:') }
x.compare!
end
```

```
Calculating -------------------------------------
=~ 26869 i/100ms
start/end 29965 i/100ms
-------------------------------------------------
=~ 1853626.9 (±8.5%) i/s - 9189198 in 4.996903s
start/end 2894114.5 (±13.0%) i/s - 14173445 in 4.993368s

Comparison:
start/end: 2894114.5 i/s
=~: 1853626.9 i/s - 1.56x slower
```

--

**actionview/lib/action_view/renderer/template_renderer.rb**:

```ruby
Benchmark.ips do |x|
x.report('=~') { layout =~ /^\// }
x.report('start/end') { layout.start_with?('/') }
x.compare!
end
```

```
Calculating -------------------------------------
=~ 25597 i/100ms
start/end 33362 i/100ms
-------------------------------------------------
=~ 1451851.0 (±9.4%) i/s - 7192757 in 5.000724s
start/end 4360476.8 (±14.0%) i/s - 21251594 in 4.996049s

Comparison:
start/end: 4360476.8 i/s
=~: 1451851.0 i/s - 3.00x slower
```

--

**activesupport/lib/active_support/multibyte/chars.rb**:

```ruby
Benchmark.ips do |x|
x.report('=~') { method.to_s =~ /!$/ }
x.report('start/end') { method.to_s.end_with?('!') }
x.compare!
end
```

```
Calculating -------------------------------------
=~ 25899 i/100ms
start/end 30125 i/100ms
-------------------------------------------------
=~ 2046233.9 (±9.2%) i/s - 10126509 in 4.998104s
start/end 3313337.1 (±12.0%) i/s - 16267500 in 4.994593s

Comparison:
start/end: 3313337.1 i/s
=~: 2046233.9 i/s - 1.62x slower
```