Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Homework solution #116

Open
wants to merge 2 commits into
base: master
Choose a base branch
from

Conversation

araslanov-e
Copy link

  • Оптимизировал загрузку больших данных
  • Оптимизировал загрузку страницы Маршрута
  • Добавил тест производительности
  • Описал этапы оптимизации

Copy link
Collaborator

@spajic spajic left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ ещё бы индексов накинуть и рендеринг коллекций заюзать

Я решил исправить эту проблему, оптимизировав эту программу.

#### Формирование метрики
Для того, чтобы понимать, дают ли мои изменения положительный эффект на быстродействие программы я добавил вывод времени выполнения программы (определяю временную метку в начале выполнения и в конце, и смотрю разницу).
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

простое и достаточное решение 👍

При первом запуске программы с medium.json файлом она отработала за ~ 1 минуту.

#### Гарантия корректности работы оптимизированной программы
Для гарантии был добавлен тест, который в фидбек-лупе позволяет не допустить изменения логики программы при оптимизации.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

```

#### Профилирование
Чтобы понять какие проблемы с программой, я решил использовать логи, которые записываются в `log/development.log`.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Как говорит Nate Berkopec, если бы все смотрели логи, у меня не было бы работы

```

#### Профилирование
Чтобы понимать какие возможны проблемы на странице я добавил "mini-profiler-resources", который показывает что происходит при загрузке страницы. Дополнительно я установил pghero, чтобы анализировать sql запросы.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

не пойму что такое mini-profiler-resources? rack-mini-profiler имеется в виду?

погуглил "mini-profiler-resources" - ничего не нашёл

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лол, даже сам не понимаю от куда я мог это взять))) да, должен быть rack-mini-profiler

#### Поиск проблем
Используя mini-profiler-resources я обнаруж что на странице делается 1975 sql запросов. Pghero так же показал что есть 2 запроса, которые делаюся более 1900 раз - Автобусы и Сервисы автобусов. Предполагаю что проблема на странице N+1 проблема. Для исправления добавил includes к Trip, для того чтобы формировались несколько запросов на все данные. После этого страница стала грузится за ~2.5 секунды, а количество sql запросов стало 5.

После mini-profiler-resources показал что на странице очень много рендрерится шаблонов - списка услуг и сами услуги. Я решил избавится от шаблонов и перенести всё основной шаблон. После чего страница стала грузится за 0,6 секунд
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

я уже видел в чатике, что вы уже об этом узнали, но напишу что можно было бы использовать render collection API, там можно даже задать шаблон делимитера параметром https://guides.rubyonrails.org/layouts_and_rendering.html#spacer-templates

так получается не так сильно тормозит, но при этом можно сохранить удобство разбивки вьюх по паршлам


После mini-profiler-resources показал что на странице очень много рендрерится шаблонов - списка услуг и сами услуги. Я решил избавится от шаблонов и перенести всё основной шаблон. После чего страница стала грузится за 0,6 секунд

#### Результаты
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

можно было бы ещё индексов накинуть; именно для рендеринга страницы тут это не так критично, хотя тоже помогает

но если бы мы заходили с точки зрения оптимизации БД - там бы это очень сильно помогло

(в тч составной индекс можно на trips(from, to))

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Да, про индексы я знаю, но не один инструмент не показал в этом необходимости, для large файла. Наверное с бонусными файлами потребовалось бы, но отложил их на потом.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Старался следовать философии оптимизации) оптимизировать только Главные точки и остановится когда достигли желаемого)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants