Или как я впервые писал и анализировал бенчмарки
Я отношусь к бенчмаркам довольно скептически, большинство статей которые я читал на эту тему сравнивали разные языки программирования. Одна из главных проблем таких бенчмарков - проверяются синтетические сценарии которые мало относятся к действительности, например анализ того как разные языки высчитывают факториал числа или Число Фибоначчи. На мой взгляд это не совсем отражает реальную производительность в реальных условиях, на реальных прикладных проектах.
Я думаю полезней использовать бенчмарки для каких то конкретных ситуаций и случаев, что бы узнать как конкретно в этом случае работает система, при этом не обобщая и не экстраполируя вывод на весь язык или всю технологию полностью. Но все равно в таком случае нужно помнить что недостатки бенчмарков никуда не пропадают.
Мне попалась как раз такая задача, в рамках которой нужно было узнать разницу между применением 2 методов для поиска данных в массиве в
Clickhouse
.Метод
has
- проверяет есть ли в массиве одно конкретное значениеНапример:
SELECT has([1, 2, 3], 2); - вернет true, так как в массиве есть число 2
Метод
hasAny
- проверяет есть ли в массиве одно из нескольких значенийНапример:
SELECT hasAny([1, 2, 3], [3, 5]); - вернет true, так как найдено число 3
В рамках моей задачи вполне валидной ситуацией является массив с только одним значением. Например, у меня массив с одним значением цифрой 5
[5]
Какой метод в таком случае лучше использовать, стоит ли добавлять условие для такого кейса или разницы нет? Изначально я с уверенностью сказал тимлиду что разницы нет, это просто поиск значения в массиве и всегда найдется первое найденное (и единственное) значение.
Что
has([1], 1)
сразу найдет единицу, что hasAny([1], [1])
, сразу найдет единицу.Но мне посоветовали проверить это, так как реализация методов отличается и не всё так просто.
Так как мы работаем с большим количеством запросов и данных, я решил разобраться с этим, мы декларировали цель - если разница есть и она больше хотя бы 15% в скорости выполнения - нужно добавить специальное условие которое для одного элемента в массиве будет использовать нужный метод.
Мне скинули пару заготовок похожих измерений на Python и я решил использовать их и не пытаться переписывать это на
JS
или Go
. Python в этом плане приятно удивил, несмотря на то что мне не очень нравится его синтаксис, на нем получилось удобно и главное быстро написать код, который заполнит Clickhouse
большим количеством данных.Я написал скрипт который нагенерировал 568млн записей с рандомными значениями, но это заняло целых 1,5 часа. Я думаю это показательная ситуация о том как сильно важна многопоточность, на мой взгляд это довольно долго.
В итоге прогнав бенчмарки на 50 случайных значениях 5 раз для надежности я получил следующие результаты - разница действительно есть и она составляет ~7% в пользу has(). Следовательно, переписывать особо смысла не имеет.
Хоть мне в какой-то момент и было интересно разобраться в этом, рефлексируя над итогом я думаю этот ресёрч который имеет мало смысла. Он имеет очень мало ценности для бизнеса, даже если бы там было больше 15%, кейс слишком узкий, что бы так углубляться в него. Еще вещь которая мне не нравится - ресерч привел к тому что "ничего делать не надо", т.е. как будто результата никакого нет, нужно все оставить как было. Из этого следует что и время на это можно было не тратить, поэтому у меня есть ощущения что это была интересная, но бессмысленая деятельность.