Мікрооптимізації vs читаємість

Бот для управління чатом зроблений на Ruby on Rails. Для визначення команди використовується наступна конструкція: if command.downcase == "!ban"

.downcase тому що раніше на телефоні мав клавіатуру яка після знаку оклика піднімала регістр. Зараз вже не така, але регістро-незалежний код залишився.

У всіх Rails проектах для підтримання порядку використовую лінтер Rubocop. Крім форматування він ще підказуває ідіоматичні речі та перформенс проблеми. І от після чергового регулярного апдейту пакетів я проганяю рубокоп, а він мені і каже:

app/models/moderator_bot.rb:42:8: C: [Correctable] Performance/Casecmp: Use command.casecmp("!ban").zero? instead of command.downcase == "!ban".
    if command.downcase == "!ban"
       ^^^^^^^^^^^^^^^^^^^^^^^^^^

Ну я такий думаю ок, зроблю rubocop -A, хай автоматом підставить те що треба. Зробив, забув.

Нещодавно додавав ще одну команду, дивлюся на той код, а він мені не подобається. Ну от уявіть, замість простого і всім зрозумілого downcase та == я тепер бачу сішне casecmp а потім ще й zero?. Треба пам'ятати що є така функція яка порівнює рядки, і якщо вони співпадають, то вона вертає 0, а якщо не співпадають, то щось відмінне від 0, можливо 1, а можливо і -1.

Я вирішив що так діла не буде, і треба викинути гидку сішну конструкцію. Та стало цікаво, звідки взагалі взялося це правило. Пішов на документацію, там є посилання на гітхаб з бенчмарками та результатами замірів. Різниця між == та casecmp у нас така:

Comparison:
      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

Тобто «оптимізоване» порівняння рядків буде аж на 40% швидше! Ніби непогано! Але сама операція при цьому займає 200 наносекунд! Тих порівняннь у мене по коду п'ять штук далі. З одного боку я розумію що от з таких 50 наносекунд різниці тут і там, потім складається повільний веб, але не у моєму випадку тільки в базу сходити буде коштувати десяток мілісекунд.

Вони б ще туди інтрінсіки запхали, їй-б-гу.

Викинув те правило та повернув все на ==. Чого і вам бажаю.

upd: Уважний читач Ігор Є. помітив, що замість «п'яти порівнянь далі по коду» можна зробити extract variable. І хоча пост не зовсім про це, а більше про читаємість, маю зізнатися що тут я дав маху. Зовісм глупий став.


Сподобалось? Долучайтеся до мого телеграм каналу: https://t.me/full_of_hatred