- PVSM.RU - https://www.pvsm.ru -

Почем оптимизация или «бесплатных завтраков не бывает»

Today's software engineering word is «farpotshket.» This is a Yiddish word meaning, «broken, because someone tried to fix it.»
(с) Andr Zerozero

Схлеснулись мы тут на днях на работе по вопросу «А хорошо бы закешировать регулярку», в совершенно банальной функции

  uncached = function(data_in) {
    return /_(d)+(?:#(d)+)?$/.exec(data_in);
  };

сделав как-то так

  cached = (function() {
    var pattern = /_(d)+(?:#(d)+)?$/;
    return function(data_in) {
      return pattern.exec(data_in);
    };
  })();

Идея популярная, но многие ли задумывались о реальном профите и накладных расходах?

Результаты сравнительных тестов [1] производительности получились странные — противоречащие моим ожиданиям, да еще и разница оказалась в пределах погрешности измерения:

uncached     13,268
cached       13,070

Хотя может быть на какой-то связке платформа-браузер цифры и будут валидными, но во что это обходится?

Берем complexity-report [2] и смотрим на показатели наших функций, соответственно:

Function: uncached
    Physical SLOC: 3
    Logical SLOC: 1
    Parameter count: 1
    Cyclomatic complexity: 1
    Halstead difficulty: 2
    Halstead volume: 18.094737505048094
    Halstead effort: 36.18947501009619

Function: cached
    Physical SLOC: 8
    Logical SLOC: 3
    Parameter count: 0
    Cyclomatic complexity: 1
    Halstead difficulty: 2.6666666666666665
    Halstead volume: 22.458839376460833
    Halstead effort: 59.89023833722889

Абсолютные цифры невелики, но все же обратим внимание на показатели кода по Halstead [3] — 30% рост difficulty и 65% рост effort при близком к нулю профите — хороший намек о том, что что-то пошло не так.

Да, есть хорошие практики и отличные советы, но пользоваться ими надо с умом, критически оценивая и не выдергивая их из контекста.
И не занимайтесь предварительной оптимизацией — сначала профайлинг и только потом улучшения.

Короче — не делайте фигни.

Автор: meettya

Источник [4]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/33998

Ссылки в тексте:

[1] сравнительных тестов: http://jsperf.com/re-uncached-cached-bulder-local

[2] complexity-report : https://npmjs.org/package/complexity-report

[3] Halstead: http://en.wikipedia.org/wiki/Halstead_complexity_measures

[4] Источник: http://habrahabr.ru/post/179267/