Skip to content

Remove String#casecmp part #123

Description

@AlexWayfer

The String#casecmp method does not work with Unicode (even in Ruby 2.4.1), this is written in the documentation.

Example:

'Привет'.casecmp('привет')# => -1

There is a method String#casecmp?, which works with Unicode.

Example:

'Привет'.casecmp?('привет')# => true

But String.casecmp? is slower:

Warming up --------------------------------------
String#downcase + == 233.440k i/100ms
String#casecmp 274.247k i/100ms
String#casecmp? 219.906k i/100ms
Calculating -------------------------------------
String#downcase + == 5.746M (± 1.7%) i/s - 28.947M in 5.039252s
String#casecmp 6.942M (± 1.8%) i/s - 34.829M in 5.019073s
String#casecmp? 4.517M (± 2.6%) i/s - 22.650M in 5.017864s
Comparison:
String#casecmp: 6941676.9 i/s
String#downcase + ==: 5745893.8 i/s - 1.21x slower
String#casecmp?: 4517314.3 i/s - 1.54x slower
Code

require'benchmark/ips'SLUG='ABCD'defslowSLUG.downcase == 'abcd'enddeffastSLUG.casecmp('abcd') == 0enddefanotherSLUG.casecmp?('abcd')endBenchmark.ipsdo |x|
x.report('String#downcase + =='){slow}x.report('String#casecmp'){fast}x.report('String#casecmp?'){another}x.compare!end

So, String#downcase + == is good compromise.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions