забавное про цикл for
хочу рассказать про недавний забавный случай на работе. Я поспорил с коллегой по поводу использования итераторов по массивам в сравнении с циклом for. Поводом для этого послужило то, что я считал определённые элементы в маленьком массиве посредством filter(…).length
, а он это переделал в for
. Аргументы друг друга нас не убедили, и коллега решил вынести это на более широкое обсуждение, и даже приготовил маленькую презентацию и тест.
аргумент коллеги был таков: использование filter
приводит к выполнению многих посторонних операций, которые совершенно не нужны для такой простой вещи, как подсчёт определённых элементов. В результате драматически (в 150000 раз) ухудшается производительность, что и демонстрируется вот этим сравнением loop
vs filter
.
результаты теста были, конечно, разгромные. Однако тест этот синтетический, поэтому я на всякий случай повторил стандартные аргументы:
- важна не только производительность, но и выразительность кода, и мы уже много раз сделали выбор в пользу выразительности
- функциональный код содержит меньше операторов, поэтому читается легче и даёт меньше шансов ошибиться, тогда как
for
буквально напрашивается на ошибки - мы используем итераторы только для очень маленьких массивов, где такая разница в производительности будет незаметна
- примитивная математика в проверках этого теста, возможно, хорошо оптимизируется браузером, а более сложный реальный код сводит относительное ускорение от
for
к минимуму - предварительная оптимизация часто бывает злом, и обычно лучше ускорять медленное, чем пытаться сразу написать быстрое
шеф выступил в роли арбитра и начал говорить, что с его 15-летним опытом работы программистом что filter
, что for
читаются одинаково легко. Я возразил, что это обманчивое впечатление, ошибки в for
легко не заметить, и предложил проверить, что же именно выводит протестированный код
конечно же, супер-оптимальный for
завершался в 150000 раз быстрее потому, что падал с ошибкой в первой же строчке. Когда мы это починили, правильное сравнение loop
vs filter
показало выигрыш в скорости всего в 10 раз. На наших реальных данных это единицы наносекунд.
я был очень благодарен коллеге и шефу за эту демонстрацию : )