From b4859269949080d85e0cc875bf2dfea2a581c01f Mon Sep 17 00:00:00 2001 From: Nihad Abbasov Date: Wed, 9 Dec 2020 02:37:41 +0200 Subject: [PATCH 1/2] Update benchmark with `String#casecmp?` example [`String#casecmp?`](https://ruby-doc.org/core-2.4.0/String.html#method-i-casecmp-3F) was introduced in Ruby 2.4 --- README.md | 24 ++++++++++++++---------- code/string/casecmp-vs-downcase-==.rb | 5 +++++ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 6260fc7..42e93e8 100644 --- a/README.md +++ b/README.md @@ -1064,22 +1064,26 @@ Comparison: String#dup: 3566485.7 i/s - 2.16x slower ``` -##### `String#casecmp` vs `String#downcase + ==` [code](code/string/casecmp-vs-downcase-==.rb) +##### `String#casecmp` vs `String#casecmp?` vs `String#downcase + ==` [code](code/string/casecmp-vs-downcase-==.rb) + +`String#casecmp?` is available on Ruby 2.4 or later. ``` $ ruby -v code/string/casecmp-vs-downcase-\=\=.rb -ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin14] - +ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin19] +Warming up -------------------------------------- + String#casecmp? 395.796k i/100ms +String#downcase + == 543.958k i/100ms + String#casecmp 730.028k i/100ms Calculating ------------------------------------- -String#downcase + == 101.900k i/100ms - String#casecmp 109.828k i/100ms -------------------------------------------------- -String#downcase + == 2.915M (± 5.4%) i/s - 14.572M - String#casecmp 3.708M (± 6.1%) i/s - 18.561M + String#casecmp? 3.687M (±10.9%) i/s - 18.602M in 5.158065s +String#downcase + == 5.017M (±11.3%) i/s - 25.022M in 5.089175s + String#casecmp 6.948M (± 6.0%) i/s - 35.041M in 5.062714s Comparison: - String#casecmp: 3708258.7 i/s -String#downcase + ==: 2914767.7 i/s - 1.27x slower + String#casecmp: 6948231.0 i/s +String#downcase + ==: 5017089.5 i/s - 1.38x (± 0.00) slower + String#casecmp?: 3686650.7 i/s - 1.88x (± 0.00) slower ``` ##### String Concatenation [code](code/string/concatenation.rb) diff --git a/code/string/casecmp-vs-downcase-==.rb b/code/string/casecmp-vs-downcase-==.rb index 027f748..be46803 100644 --- a/code/string/casecmp-vs-downcase-==.rb +++ b/code/string/casecmp-vs-downcase-==.rb @@ -2,6 +2,10 @@ SLUG = 'ABCD' +def slowest + SLUG.casecmp?('abcd') +end + def slow SLUG.downcase == 'abcd' end @@ -11,6 +15,7 @@ def fast end Benchmark.ips do |x| + x.report("String#casecmp?") { slowest } if RUBY_VERSION >= "2.4.0".freeze x.report('String#downcase + ==') { slow } x.report('String#casecmp') { fast } x.compare! From e896d22feaf6956d816c252ace8db1167c05441b Mon Sep 17 00:00:00 2001 From: Nihad Abbasov Date: Wed, 9 Dec 2020 02:57:41 +0200 Subject: [PATCH 2/2] Add a note about Unicode characters --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 42e93e8..ba00f93 100644 --- a/README.md +++ b/README.md @@ -1067,6 +1067,7 @@ Comparison: ##### `String#casecmp` vs `String#casecmp?` vs `String#downcase + ==` [code](code/string/casecmp-vs-downcase-==.rb) `String#casecmp?` is available on Ruby 2.4 or later. +Note that `String#casecmp` only works on characters A-Z/a-z, not all of Unicode. ``` $ ruby -v code/string/casecmp-vs-downcase-\=\=.rb