-
Notifications
You must be signed in to change notification settings - Fork 195
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
Task 1 #153
base: master
Are you sure you want to change the base?
Task 1 #153
Conversation
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.
Nice work, respect!
@@ -0,0 +1,150 @@ | |||
# Case-study оптимизации |
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.
О, Лена, привет!
|
||
Она успешно работала на файлах размером пару мегабайт, но для большого файла она работала слишком долго, и не было понятно, закончит ли она вообще работу за какое-то разумное время. | ||
|
||
Я решил исправить эту проблему, оптимизировав эту программу. |
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.
решила*
## Формирование метрики | ||
Для того, чтобы понимать, дают ли мои изменения положительный эффект на быстродействие программы я придумал использовать такую метрику: | ||
- время выполнения должно быть линейным | ||
- в случае линейности 1_000_000 должен работать не больше 9 секунд |
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.
это намного продуманнее того что обычно пишут, но не совсем корректно
то что ты написала, это условие остановки / бюджет, который получен аппроксимацией линейной
Этот вопрос в данном случае tricky. По факту нет простого одного ответа на всю работу. У нас на каждую итерацию оптимизации новая метрика - время работы на файлах разного размера. Когда мы не можем посчитать общую метрику на всю систему / исходную проблему, то мы можем воспользоваться промежуточными метриками. Их функция получается в том, чтобы помочь нам понять, была ли оптимизация успешна на данной итерации.
Программа поставлялась с тестом. Выполнение этого теста в фидбек-лупе позволяет не допустить изменения логики программы при оптимизации. | ||
|
||
## Feedback-Loop | ||
Для того, чтобы иметь возможность быстро проверять гипотезы я выстроил эффективный `feedback-loop`, который позволил мне получать обратную связь по эффективности сделанных изменений за *не поняла как оценить время* |
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.
ну я бы тут оценивал сколько у тебя времени уходит на ожидание результата после запуска очередного варианта кода. если это секунд 10-15, то кайф, не нарушается состояние потока
- Время выполнения на 20000: 2.843040 | ||
- Время выполнения на 40000: 12.927038 | ||
|
||
рост квадратичный -> O(n^2) |
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.
👍
### Ваша находка №4 | ||
1) продолжим использовать 640000 | ||
2) в топе самых долгих методов остается collect_stats_from_users (42%), посмотрим внутрь - там метод Date.parse (total 25%) | ||
3) заметим, что даты приходят в iso8601, поэтому можно опустить парсинг и сразу использовать |
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.
пасхалочка
6) поправим тест на перфманс (поставим границу 2.5 с) | ||
7) проверим время на 1млн: 3.760000 | ||
8) проверим на полном файле: 17.444283 секунд | ||
9) ради интереса проверим с выключенным gc: ~14 секунд |
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.
но чисто ради интереса, а то так и память может кончиться
|
||
## Результаты | ||
В результате проделанной оптимизации наконец удалось обработать файл с данными. | ||
Удалось улучшить метрику системы с ~23ч (предварительная оценка) до ~17.5 сек и уложиться в заданный бюджет. |
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.
респект за оценку исходного времени!
end | ||
|
||
describe 'Performance' do | ||
it '80_000 works under 0.2s' do |
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.
it 'processes 80_000 lines under 0.2s'
end.to perform_under(200).ms.warmup(2).times.sample(5).times | ||
end | ||
|
||
it 'has linear performance' do |
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.
👍
No description provided.