Skip to content

homework №2 #102

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

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
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
2 changes: 2 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
{
}
18 changes: 9 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,15 +44,15 @@ puts "MEMORY USAGE: %d MB" % (`ps -o rss= -p #{Process.pid}`.to_i / 1024)"
- в описание `PR` добавьте чеклист и отметьте, что из него сделали; для получения максимальной пользы надо отметить всё.

## Checklist
- [ ] Построить и проанализировать отчёт гемом `memory_profiler`
- [ ] Построить и проанализировать отчёт `ruby-prof` в режиме `Flat`;
- [ ] Построить и проанализировать отчёт `ruby-prof` в режиме `Graph`;
- [ ] Построить и проанализировать отчёт `ruby-prof` в режиме `CallStack`;
- [ ] Построить и проанализировать отчёт `ruby-prof` в режиме `CallTree` c визуализацией в `QCachegrind`;
- [ ] Построить и проанализировать текстовый отчёт `stackprof`;
- [ ] Построить и проанализировать отчёт `flamegraph` с помощью `stackprof` и визуализировать его в `speedscope.app`;
- [ ] Построить график потребления памяти в `valgrind massif visualier` и включить скриншот в описание вашего `PR`;
- [ ] Написать тест, на то что программа укладывается в бюджет по памяти
- [x] Построить и проанализировать отчёт гемом `memory_profiler`
- [x] Построить и проанализировать отчёт `ruby-prof` в режиме `Flat`;
- [x] Построить и проанализировать отчёт `ruby-prof` в режиме `Graph`;
- [x] Построить и проанализировать отчёт `ruby-prof` в режиме `CallStack`;
- [x] Построить и проанализировать отчёт `ruby-prof` в режиме `CallTree` c визуализацией в `QCachegrind`;
- [x] Построить и проанализировать текстовый отчёт `stackprof`;
- [] Построить и проанализировать отчёт `flamegraph` с помощью `stackprof` и визуализировать его в `speedscope.app`;
- [x] Построить график потребления памяти в `valgrind massif visualier` и включить скриншот в описание вашего `PR`;
- [x] Написать тест, на то что программа укладывается в бюджет по памяти

Не нужно включать в `PR` выводы всех этих отчётов, просто используйте каждый хотя бы по разу в вашем `Case-study`.

Expand Down
104 changes: 104 additions & 0 deletions case-study.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
За основу взял оптимизированный по CPU код из первого задания
Copy link
Collaborator

Choose a reason for hiding this comment

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

👍


Первый отчет memory profiler
```
MEMORY USAGE: 122 MB
Copy link
Collaborator

Choose a reason for hiding this comment

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

Не корректно смешивать замеры и профилирование

Само присутствие memory_profiler увеличивает потребление памяти

Правило: Замеры отдельно - профилирование отдельно

Total allocated: 40.17 MB (511366 objects)
Total retained: 40.00 B (1 objects)
allocated memory by location
-----------------------------------
15.40 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:39
4.62 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:26
2.96 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:106
```

Самое проблемное на строке
```
columns = line.split(',')
```
Начнем с фриза
```
MEMORY USAGE: 112 MB
Total allocated: 37.37 MB (441381 objects)
Total retained: 40.00 B (1 objects)

allocated memory by location
-----------------------------------
14.10 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:39
4.62 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:26
2.96 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:106
```
Пока не вижу смысла разбора отчетов, программа даже на небольшом объеме данных занимает много места, перепишу на потоковую обработку и заполнение файла

После переписания замерил потребление на 1кк данных
```
MEMORY USAGE: 2047 MB
Total allocated: 777.78 MB (10839411 objects)
Total retained: 19.17 kB (206 objects)

allocated memory by gem
-----------------------------------
777.76 MB other
15.34 kB set

allocated memory by file
-----------------------------------
777.76 MB /home/peplum/dev/rails-optimization-task2/task-2.rb
15.34 kB /home/peplum/.rbenv/versions/3.1.3/lib/ruby/3.1.0/set.rb
40.00 B profile.rb

allocated memory by location
-----------------------------------
233.85 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:21
142.17 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:30
80.66 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:18
63.25 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:81
57.31 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:73
49.20 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:25
35.15 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:78
23.36 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:62
23.36 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:63
23.36 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:64
22.91 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:79
10.36 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:80
```
Наибольшее место занимает split и хэш session, программа выглядит так, что оптимизировать больше нечего, кроме замены all? и any?

Замеры после замены методов, удаления regex:
```
MEMORY USAGE: 1954 MB
Total allocated: 732.33 MB (10365779 objects)
Total retained: 19.17 kB (206 objects)

allocated memory by gem
-----------------------------------
732.32 MB other
15.34 kB set

allocated memory by file
-----------------------------------
732.32 MB /home/peplum/dev/rails-optimization-task2/task-2.rb
15.34 kB /home/peplum/.rbenv/versions/3.1.3/lib/ruby/3.1.0/set.rb
40.00 B profile.rb

allocated memory by location
-----------------------------------
233.85 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:21
142.17 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:30
80.66 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:18
63.25 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:85
57.31 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:77
49.20 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:25
23.36 MB /home/peplum/dev/rails-optimization-task2/task-2.rb:62
```
Снижение с 777мб до 732мб

Больше точек оптимизации найти не могу, попробовал замерить потребление в valgrind massif, результат такой
![Alt text](<images/Screenshot from 2023-10-29 19-00-19.png>)
Пик потребления не достигает даже 1мб, пробовал по разному запускать, результат не меняется, всегда пик 3.1kb, то же самое происходит и с heaptrack
![Alt text](<images/Screenshot from 2023-10-29 19-02-30.png>)
Comment on lines +98 to +99
Copy link
Collaborator

Choose a reason for hiding this comment

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

Возможно программа не запускается / либо что-то не работает

Но простой прогон с puts в конце показывает
Copy link
Collaborator

Choose a reason for hiding this comment

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

Да, см коммент выше

```
MEMORY USAGE: 30 MB
```
Программа теперь выполняется примерно за 9.6 секунд
Copy link
Collaborator

Choose a reason for hiding this comment

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

👍 быстро и с минимальным потреблением памяти 👍

Loading