-
Notifications
You must be signed in to change notification settings - Fork 50
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
case-study о проделанной оптимизации #17
Open
mikeoleynik
wants to merge
1
commit into
hardcode-dev:master
Choose a base branch
from
mikeoleynik:task7
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,40 +1,33 @@ | ||
# Задание №7. Оптимизация `test-suite` и сбор `DX`-метрик | ||
|
||
В этом задании вам нужо попрактиковаться в оптимизации `test-suite` и сборе `DX`-метрик. | ||
|
||
## Оптимизация test-suite | ||
Можно оптимизировать test-suite `dev.to`, либо своего проекта. | ||
|
||
В любом случае для сдачи задания нужно написать `case-study` о сделанной оптимизации. | ||
|
||
Вооружитесь инструментами, рассмотренными на лекции, и разгоните этот test-suite! | ||
|
||
## Сбор DX-метрики | ||
|
||
Чтобы запечатлеть свой прогресс и в дальнейшем защитить его от деградации, сделайте сбор `DX`-метрики времени выполнения `test-suite` в `InfluxDB` и постройте график в `Chronograf`. | ||
|
||
Сделать это очень просто с помощью https://github.com/influxdata/TICK-docker и https://github.com/palkan/influxer. | ||
|
||
Подумайте, как бы вам было удобно прикрепить отправку метрики в `InfluxDB` к прогону тестов. | ||
|
||
## Hints | ||
|
||
Старайтесь держать `feedback-loop` коротким. `test-suite` `dev.to` целиком в один процесс выполняется около 10 минут, это очень долго. | ||
|
||
Используйте семплирование или работайте с конкретными наиболее долгими тестами. | ||
|
||
Если вы обнаружите проблему, то выберите какой-нибудь один тест, на котором она воспроизводится, и исправьте её, работая с этим тестом. | ||
|
||
Попробуйте все инструменты из `test-prof`! | ||
|
||
`json-flamegraph` для всего `test-suite` целиком занимает около `1Gb`. `Speedscope.app` открыть его не может. | ||
|
||
C отчётом `stackprof` для всего `test-suite` можно работать через `CLI stackprof`, и через `qcachegrind`. | ||
|
||
С `ruby-prof` надо работать ещё аккуратнее, потому что он, как `tracing profiler`, собирает очень много данных, с которыми в дальнейшем тяжело работать. | ||
|
||
|
||
## Чек-лист для сдачи задания | ||
- [x] PR в этот репозиторий с `case-study` о проделанной оптимизации и достигнутых результатах в описании | ||
- [x] Если оптимизируете `dev.to`, то сделать `PR` с оптимизацией в https://github.com/hardcode-dev/rails-optimization-2-task4 и добавить в этот PR ссылку на него | ||
- [x] Добавить скриншот с графиком изменения времени прогона `test-suite` в `Chronograf` по мере оптимизации | ||
### Case-study оптимизации | ||
|
||
Для экспериментов я взял самый медленный спек на своем проекте. | ||
|
||
1) Первое что я сделал - прогнал его вместе с `RSpecDissect`: | ||
``` | ||
[TEST PROF INFO] RSpecDissect report | ||
Total time: 00:23.176 | ||
Total `let` time: 00:20.298 | ||
Total `before(:each)` time: 00:22.742 | ||
|
||
Finished in 23.19 seconds (files took 3.52 seconds to load) | ||
``` | ||
Создание основных сущностей я переделал с помощью `let_it_be` + вынес некоторые операции (создания второстепенных сущностей) в before_all: | ||
``` | ||
[TEST PROF INFO] RSpecDissect report | ||
Total time: 00:03.392 | ||
Total `let` time: 00:01.659 | ||
Total `before(:each)` time: 00:03.031 | ||
|
||
Finished in 4.64 seconds (files took 3.54 seconds to load) | ||
``` | ||
Время прогона тестов сократилось в 5 раз. | ||
|
||
2) Дальше я решил, что надо избавиться от каскадного создания объектов. Для этого подключил `FactoryProf` и прогнал тесты с переменной `FPROF=flamegraph` | ||
Время прогона тестов сократилось еще в двое: | ||
Finished in 2.23 seconds (files took 3.57 seconds to load) | ||
|
||
3) Так же запускал с `FactoryDoctor`, но замена `create` на `build_stubbed` не дает значительного прироста, возмжно на всех тестах это будет заметнее. | ||
|
||
### Резюме | ||
Выбрав оттельный спек удалось сократить время прогонов тестов в 10 раз. | ||
Остальные спеки в целом проходят успешно, но есть и красные с которыми нужно разбираться. Но думаю это не составит труда |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Классика, 👍