Conversation
araslanov-e
commented
Feb 14, 2025
- Оптимизировал загрузку больших данных
- Оптимизировал загрузку страницы Маршрута
- Добавил тест производительности
- Описал этапы оптимизации
spajic
left a comment
There was a problem hiding this comment.
✅ ещё бы индексов накинуть и рендеринг коллекций заюзать
| Я решил исправить эту проблему, оптимизировав эту программу. | ||
|
|
||
| #### Формирование метрики | ||
| Для того, чтобы понимать, дают ли мои изменения положительный эффект на быстродействие программы я добавил вывод времени выполнения программы (определяю временную метку в начале выполнения и в конце, и смотрю разницу). |
There was a problem hiding this comment.
простое и достаточное решение 👍
| При первом запуске программы с medium.json файлом она отработала за ~ 1 минуту. | ||
|
|
||
| #### Гарантия корректности работы оптимизированной программы | ||
| Для гарантии был добавлен тест, который в фидбек-лупе позволяет не допустить изменения логики программы при оптимизации. |
| ``` | ||
|
|
||
| #### Профилирование | ||
| Чтобы понять какие проблемы с программой, я решил использовать логи, которые записываются в `log/development.log`. |
There was a problem hiding this comment.
Как говорит Nate Berkopec, если бы все смотрели логи, у меня не было бы работы
| ``` | ||
|
|
||
| #### Профилирование | ||
| Чтобы понимать какие возможны проблемы на странице я добавил "mini-profiler-resources", который показывает что происходит при загрузке страницы. Дополнительно я установил pghero, чтобы анализировать sql запросы. |
There was a problem hiding this comment.
не пойму что такое mini-profiler-resources? rack-mini-profiler имеется в виду?
погуглил "mini-profiler-resources" - ничего не нашёл
There was a problem hiding this comment.
Лол, даже сам не понимаю от куда я мог это взять))) да, должен быть rack-mini-profiler
| #### Поиск проблем | ||
| Используя mini-profiler-resources я обнаруж что на странице делается 1975 sql запросов. Pghero так же показал что есть 2 запроса, которые делаюся более 1900 раз - Автобусы и Сервисы автобусов. Предполагаю что проблема на странице N+1 проблема. Для исправления добавил includes к Trip, для того чтобы формировались несколько запросов на все данные. После этого страница стала грузится за ~2.5 секунды, а количество sql запросов стало 5. | ||
|
|
||
| После mini-profiler-resources показал что на странице очень много рендрерится шаблонов - списка услуг и сами услуги. Я решил избавится от шаблонов и перенести всё основной шаблон. После чего страница стала грузится за 0,6 секунд |
There was a problem hiding this comment.
я уже видел в чатике, что вы уже об этом узнали, но напишу что можно было бы использовать render collection API, там можно даже задать шаблон делимитера параметром https://guides.rubyonrails.org/layouts_and_rendering.html#spacer-templates
так получается не так сильно тормозит, но при этом можно сохранить удобство разбивки вьюх по паршлам
|
|
||
| После mini-profiler-resources показал что на странице очень много рендрерится шаблонов - списка услуг и сами услуги. Я решил избавится от шаблонов и перенести всё основной шаблон. После чего страница стала грузится за 0,6 секунд | ||
|
|
||
| #### Результаты |
There was a problem hiding this comment.
можно было бы ещё индексов накинуть; именно для рендеринга страницы тут это не так критично, хотя тоже помогает
но если бы мы заходили с точки зрения оптимизации БД - там бы это очень сильно помогло
(в тч составной индекс можно на trips(from, to))
There was a problem hiding this comment.
Да, про индексы я знаю, но не один инструмент не показал в этом необходимости, для large файла. Наверное с бонусными файлами потребовалось бы, но отложил их на потом.
There was a problem hiding this comment.
Старался следовать философии оптимизации) оптимизировать только Главные точки и остановится когда достигли желаемого)