Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 35 additions & 25 deletions case-study-template.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,44 +12,54 @@
Я решил исправить эту проблему, оптимизировав эту программу.

## Формирование метрики
Для того, чтобы понимать, дают ли мои изменения положительный эффект на быстродействие программы я придумал использовать такую метрику: *тут ваша метрика*
Для того, чтобы понимать, дают ли мои изменения положительный эффект на быстродействие программы я придумал использовать такую метрику: затрачиваемое количество мегабайт памяти на обработку файла в 10000 строк.

## Гарантия корректности работы оптимизированной программы
Программа поставлялась с тестом. Выполнение этого теста в фидбек-лупе позволяет не допустить изменения логики программы при оптимизации.

## Feedback-Loop
Для того, чтобы иметь возможность быстро проверять гипотезы я выстроил эффективный `feedback-loop`, который позволил мне получать обратную связь по эффективности сделанных изменений за *время, которое у вас получилось*
Для того, чтобы иметь возможность быстро проверять гипотезы я выстроил эффективный `feedback-loop`, который позволил мне получать обратную связь по эффективности сделанных изменений за несколько секунд.

Вот как я построил `feedback_loop`: *как вы построили feedback_loop*
Вот как я построил `feedback_loop`: поскольку в программе имелся тест проверяющий корректность работы и выводилось количество потребляемой памяти, то фактически оставалось только подобрать подходящий объем данных, чтобы не приходилось долго ждать выполнения программы (я остановился на значении 10000 строк).

## Вникаем в детали системы, чтобы найти главные точки роста
Для того, чтобы найти "точки роста" для оптимизации я воспользовался *инструментами, которыми вы воспользовались*
Для того, чтобы найти "точки роста" для оптимизации я воспользовался memory_profiler, stackprof и ruby-prof.

Вот какие проблемы удалось найти и решить

### Ваша находка №1
- какой отчёт показал главную точку роста
- как вы решили её оптимизировать
- как изменилась метрика
- как изменился отчёт профилировщика

### Ваша находка №2
- какой отчёт показал главную точку роста
- как вы решили её оптимизировать
- как изменилась метрика
- как изменился отчёт профилировщика

### Ваша находка №X
- какой отчёт показал главную точку роста
- как вы решили её оптимизировать
- как изменилась метрика
- как изменился отчёт профилировщика
### Находка №1 - Не эффективное формирование массива с сессиями
- отчёт memory_profiler
- решил формировать массив путем простой вставки элемнета
- метрика снизилась с 89 MB до 47 MB
- указанная проблема перестала быть главной точкой роста

### Находка №2 - Создание для каждого пользователя нового массива с сессиями
- отчёт memory_profiler
- сформировать массив users_objects в цикле считывания данных из файла
- метрика снизилась с 47 MB до 34 MB
- указанная проблема перестала быть главной точкой роста

### Находка №3 - Избыточный вызов метода split в методах parse_user и parse_session
- graph отчёт ruby-prof-а
- решил избавиться от лишних вызовов метода split
- метрика снизилась с 34 MB до 33 MB
- указанная проблема перестала быть главной точкой роста

### Находка №4 - Вызов `Date#parse`
- flat отчёт ruby-prof-а
- от парсинга даты можно вообще избавиться
- метрика снизилась с 33 MB до 31 MB
- указанная проблема перестала быть главной точкой роста

### Находка №5 - Вызов split при чтении строк из файла
- все отчеты указывают на это
- не присваивать переменной результат вызова метода, а передать ему блок
Copy link
Collaborator

Choose a reason for hiding this comment

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

да split with block в этом кейсе крутое решение

- метрика снизилась с 31 MB до 23 MB
- указанная проблема перестала быть главной точкой роста

## Результаты
В результате проделанной оптимизации наконец удалось обработать файл с данными.
Удалось улучшить метрику системы с *того, что у вас было в начале, до того, что получилось в конце* и уложиться в заданный бюджет.

*Какими ещё результами можете поделиться*
Удалось улучшить метрику системы до 23 MB при обработке файла любого размера и уложиться в заданный бюджет.
Copy link
Collaborator

Choose a reason for hiding this comment

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

что-то в кейс-стади не вижу шага про переписывание в потоковом виде, хотя это сделано


## Защита от регрессии производительности
Для защиты от потери достигнутого прогресса при дальнейших изменениях программы *о performance-тестах, которые вы написали*
Для защиты от потери достигнутого прогресса при дальнейших изменениях программы я написал тест который проверяет что программа потребляет не более 23 MB памяти.
Loading