-
Notifications
You must be signed in to change notification settings - Fork 24
Task 1 #2
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
base: master
Are you sure you want to change the base?
Task 1 #2
Changes from all commits
cd4371d
318074d
37d3a71
2344bd6
a3ce925
5876740
dbe4d6b
6ba1b93
372f054
eb14b9a
a952def
6dc93e3
10b7c8e
c7677f9
bad5287
6b1e310
36ab99a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,9 @@ | ||
| .ruby-version | ||
| .ruby-gemset | ||
|
|
||
| *.txt | ||
| *.json | ||
| *.html | ||
| *.callgrind* | ||
|
|
||
| .DS_Store |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -12,35 +12,52 @@ | |
| Я решил исправить эту проблему, оптимизировав эту программу. | ||
|
|
||
| ## Формирование метрики | ||
| Для того, чтобы понимать, дают ли мои изменения положительный эффект на быстродействие программы я придумал использовать такую метрику: *тут ваша метрика* | ||
| Для того, чтобы понимать, дают ли мои изменения положительный эффект на быстродействие программы я придумал использовать такую метрику: | ||
| - измерение общего времени выполнения с помощью `Benchmark.realtime` | ||
| - измерение общей потребляемой памяти с помощью `MemoryMeasure` | ||
| - профилирование программы с помощью `ruby-prof` и `qcachegrind` | ||
|
|
||
| ## Гарантия корректности работы оптимизированной программы | ||
| Программа поставлялась с тестом. Выполнение этого теста позволяет не допустить изменения логики программы при оптимизации. | ||
|
|
||
| ## Feedback-Loop | ||
| Для того, чтобы иметь возможность быстро проверять гипотезы я выстроил эффективный `feedback-loop`, который позволил мне получать обратную связь по эффективности сделанных изменений за *время, которое у вас получилось* | ||
|
|
||
| Вот как я построил `feedback_loop`: *как вы построили feedback_loop* | ||
| Вот как я построил `feedback_loop`: | ||
| 1. Построение гипотезы | ||
| 2. Исправление кода | ||
| 3. Запуск скрипта на тестовом файле небольшого объема (1 мб) | ||
| 4. Сопоставление новых метрик с предыдущими | ||
|
|
||
| ## Вникаем в детали системы, чтобы найти 20% точек роста | ||
| Для того, чтобы найти "точки роста" для оптимизации я воспользовался *инструментами, которыми вы воспользовались* | ||
| Для того, чтобы найти "точки роста" для оптимизации я воспользовался библиотеками benchmark, ruby-prof и инструментом визуализации qcachegrind | ||
|
|
||
| Вот какие проблемы удалось найти и решить | ||
|
|
||
| ### Ваша находка №1 | ||
| О вашей находке №1 | ||
| Львиную долю времени занимает вложенная итерация сессий при переборе пользователей. | ||
|
|
||
| ### Ваша находка №2 | ||
| О вашей находке №2 | ||
| Оптимизация `all?` (замена `=~` на `match?`, вынос регулярного выражения вне цикла, переписывание на `each`) не дает существенного прироста производительности и экономии памяти. | ||
|
|
||
| ### Ваша находка №X | ||
| О вашей находке №X | ||
| ### Ваша находка №3 | ||
| Удалось добиться небольшого ускорения, заменив парсинг даты на `Date.iso8601` и реализовав сортировку без `reverse` | ||
|
|
||
| ### Ваша находка №4 | ||
| Удалось добиться небольшого ускорения, собрав всю статистику пользователя за одну итерацию (вместо нескольких для каждого вида статистики). | ||
|
|
||
| ### Ваша находка №5 | ||
| Удалось добиться прироста производительности ~30% и сокращения объема потребляемой памяти заменой массива с проверкой на уникальность на `Set`. | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 👍 |
||
|
|
||
| ### Ваша находка №6 | ||
| В массив лучше записывать так `arr << new_el`. `arr + [new_el]` намного менее эффективен, т.к. создает дополнительный массив, и соединение двух массивов намного сложнее добавления 1 элемента в существующий массив. | ||
|
|
||
| ### Ваша находка №7 | ||
| Чтение файла построчно позволяет сэкономить немного памяти и ускорить работу. | ||
|
|
||
| ## Результаты | ||
| В результате проделанной оптимизации наконец удалось обработать файл с данными. | ||
| Удалось улучшить метрику системы с *того, что у вас было в начале, до того, что получилось в конце* | ||
|
|
||
| *Какими ещё результами можете поделиться* | ||
| Удалось улучшить метрику системы с 20 сек и 36 МБ RSS до 0.35 сек и 19 МБ RSS. | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. А исходный файл в резльтате получилось обработать?
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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.
А выполнение тестов включили в фидбек-луп?
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.
Да, я просто думал что об этом говорит пункт "Гарантия корректности работы оптимизированной программы"