You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
В файле `task-1.rb` находится ruby-программа, которая выполняет обработку данных из файла.
6
2
7
-
В файл встроен тест, который показывает, как программа должна работать.
3
+
В файле `task1.rb` находится ruby-программа, которая выполняет обработку данных из файла.
4
+
5
+
При запуске `ruby task1.rb` запускается тест, который показывает как программа должна работать.
6
+
7
+
С помощью этой программы нужно обработать файл с данными `data_large.txt`.
8
8
9
-
С помощью этой программы нужно обработать файл данных `data_large.txt`.
10
9
11
10
**Проблема в том, что это происходит слишком долго, дождаться пока никому не удавалось.**
12
11
13
12
14
13
## Задача
15
-
- Оптимизировать эту программу, выстроив процесс согласно "общему фреймворку оптимизации" из первой лекции;
16
-
- Профилировать программу с помощью инструментов, с которыми мы познакомились в первой лекции;
14
+
15
+
- Оптимизировать эту программу, выстроив процесс согласно "общему фреймворку оптимизации" из первой презентации;
16
+
- Профилировать программу с помощью `stackprof` и `ruby-prof`, (можно ещё попробовать `vernier`);
17
17
- Добиться того, чтобы программа корректно обработала файл `data_large.txt` за `30 секунд`;
18
18
- Написать кейс-стади о вашей оптимизации по шаблону `case-study-template.md`.
19
19
20
-
Case-study должен получиться рассказом с техническими подробностями о том как вы пришли к успеху в оптимизации. Можно сказать, заготовкой статьи на Хабр/Medium/...
20
+
Case-study должен получиться рассказом с техническими подробностями о том как вы пришли к успеху в оптимизации благодаря системному подходу. Можно сказать, заготовкой технической статьи.
21
21
22
22
## Сдача задания
23
-
Для сдачи задания нужно форкнуть этот проект, сделать `PR` в него и прислать ссылку для проверки.
24
23
25
-
В `PR`
26
-
- должны быть внесены оптимизации в `task-1.rb`;
24
+
Надо сделать `PR` в этот репозиторий и прислать его для проверки.
25
+
26
+
В `PR`-е
27
+
- должны быть внесены оптимизации в `task1.rb`;
27
28
- должен быть файл `case-study.md` с описанием проделанной оптимизации;
28
29
29
30
30
31
# Комментарии
31
32
32
33
## Риски
33
-
Задание моделирует такую ситуацию: вы получили неффективную систему, в которой код и производительность оставляет желать лучшего. При этом актуальной проблемой является именно производительность.
34
-
Вам нужно оптимизировать эту систему.
34
+
35
+
Задание моделирует такую ситуацию: вы получили неффективную систему, в которой код и производительность оставляет желать лучшего. При этом актуальной проблемой является именно плохая производительность.
36
+
Вам нужно оптимизировать эту незнакомую систему.
35
37
36
38
С какими искушениями вы сталкиваететь:
37
39
- вы “с ходу” замечаете какие-то непроизводительные идиомы, и у вас возникает соблазн их сразу исправить;
40
+
- попытаться в уме очень вникнуть в работу программы, как будто просветить её микроскопом, превратиться в компилятор
38
41
39
-
Эти искушения типичны и часто возникают в моделируемой ситуации.
42
+
Эти искушения типичны и часто возникают в моделируемой ситуации, но есть риски:
40
43
41
-
Их риски:
42
44
- перед рефакторингом “очевидных” косяков не написать тестов и незаметно внести регрессию;
43
45
- потратить время на рефакторинг, хотя время было только на оптимизацию;
44
-
- исправить все очевидные на глаз проблемы производительности, не получить заметного результата, решить что наверное просто Ruby слишком медленный для этой задачи, демотивироваться и разочароваться в попытках оптимизации
46
+
- исправить на глаз замеченные/предположенные проблемы, не получить заметного результата, решить что наверное просто Ruby слишком медленный для этой задачи, демотивироваться
45
47
46
48
## Советы
47
-
- Найдите объём данных, на которых программа отрабатывает достаточно быстро - это позволит вам выстроить фидбек-луп; если улучшите метрику для части данных, то улучшите и для полного объёма данных;
48
-
- Попробуйте прикинуть ассимтотику роста времени работы в зависимости от объёма входных данных (попробуйте объём x, 2x, 4x, 8x)
49
+
50
+
- Найдите объём данных, на которых программа отрабатывает достаточно быстро - это позволит вам выстроить фидбек-луп; если улучшите метрику для части данных, то улучшите и для полного объёма данных; *оптимально давать программе покрутиться секунд 5; слишком мало тоже нехорошо для профилирования и бенчмаркинга*
51
+
- Попробуйте прикинуть ассимтотику роста времени работы в зависимости от объёма входных данных (попробуйте объём x, 2x, 3x, ...)
49
52
- Оцените, как долго программа будет обрабатывать полный обём данных
50
-
- Оцените, сколько времени занимает работа `GC` (попробовав отключить его на небольшом объёме данных)
51
53
- Вкладывайтесь в удобство работы и скорость получения обратной связи, сделайте себе эффективный фидбек-луп
52
54
53
55
### Советы по профилированию и измерению метрики
54
-
- Задайте простую и понятную метрику для оптимизируемой системы
55
-
- При профилировании лучше выключать `GC` (он может вносить непредсказуемые замедления в рандомные части программы)
56
-
- Но не отключайте `GC` при вычислении метрики (в результате мы хотим, чтобы программа работала с включенным `GC`, значит без него мы будем мерить не то что надо)
57
-
- Отключайте профилировщики при вычислении метрики (они замедляют работу системы)
58
-
- Не замеряйте время профилировщиком (при замерах он вообще должен быть отключен)
56
+
57
+
- попробуйсте `rbspy`
58
+
- попробуйте `Stackprof` с визуализацией в `Speedpscope` и `CLI`
59
+
- попробуйте `ruby-prof`
60
+
- попробуйте `Vernier`
61
+
- задайте простую и понятную метрику для оптимизируемой системы (на каждой итерации)
62
+
- отключайте профилировщики при вычислении метрики (они замедляют работу системы)
63
+
- не замеряйте время профилировщиком (при замерах он вообще должен быть отключен)
64
+
- aka не смешивайте профилирование и бенчмаркинг
59
65
60
66
### Совет: как посчитать кол-во строк в файле
67
+
61
68
```
62
69
wc -l data_large.rb # (3250940) total line count
63
70
```
64
71
65
72
### Совет: как создать меньший файл из большего, оставив перевые N строк
73
+
66
74
```
67
75
head -n N data_large.txt > dataN.txt # create smaller file from larger (take N first lines)
68
76
```
69
77
70
-
## Что можно делать
71
-
- рефакторить код
72
-
- рефакторить/дописывать тесты
73
-
- разбивать скрипт на несколько файлов
74
-
75
78
## Что нужно делать
79
+
76
80
- исследовать предложенную вам на рассмотрение систему
77
81
- построить фидбек-луп, который позволит вам быстро тестировать гипотезы и измерять их эффект
78
82
- применить инструменты профилирования CPU, чтобы найти главные точки роста
79
83
- выписывать в case-study несколько пунктов: каким профилировщиком вы нашли точку роста, как её оптимизировали, какой получили прирост метрики, как найденная проблема перестала быть главной точкой роста;
80
84
85
+
81
86
## Что не нужно делать
87
+
82
88
- переписывать с нуля
83
89
- забивать на выстраивание фидбек-лупа
84
90
- вносить оптимизации по наитию, без профилировщика и без оценки эффективности
91
+
- смешивать несколько изменений в одну итерацию
92
+
93
+
## Что можно делать
94
+
95
+
- рефакторить код
96
+
- рефакторить/дописывать тесты
97
+
- разбивать скрипт на несколько файлов
85
98
86
99
## Основная польза задания
87
-
Главная польза этого задания - попрактиковаться в применении грамотного подхода к оптимизации, почуствовать этот процесс:
100
+
101
+
Главная польза этого задания - попрактиковаться в применении грамотного и системного подхода к оптимизации, почуствовать этот процесс:
88
102
- как взяли незнакомую систему и исследовали её
89
103
- как выстроили фидбек луп
90
-
- как с помощью профилировщиков нашли что именно даст вам наибольший эффект (главную точку роста)
104
+
- как с помощью профилировщиков сформировали гипотезу о том что именно даст вам наибольший эффект (главную точку роста)
91
105
- как быстро протестировали гипотезу, получили измеримый результат и зафиксировали его
92
-
- как в итоге написали небольшой отчёт об успешных шагах этого процесса
106
+
- как в итоге написали небольшой журнал об успешных шагах этого процесса
107
+
108
+
## Extended Checklist
93
109
94
-
## Checklist
95
110
Советую использовать все рассмотренные в лекции инструменты хотя бы по разу - попрактикуйтесь с ними, научитесь с ними работать.
96
111
97
112
-[ ] Прикинуть зависимость времени работы програмы от размера обрабатываемого файла
98
-
-[ ] Построить и проанализировать отчёт `ruby-prof` в режиме `Flat`;
99
-
-[ ] Построить и проанализировать отчёт `ruby-prof` в режиме `Graph`;
100
-
-[ ] Построить и проанализировать отчёт `ruby-prof` в режиме `CallStack`;
101
-
-[ ] Построить и проанализировать отчёт `ruby-prof` в режиме `CallTree` c визуализацией в `QCachegrind`;
102
-
-[ ] Построить дамп `stackprof` и проанализировать его с помощью `CLI`
103
-
-[ ] Построить дамп `stackprof` в `json` и проанализировать его с помощью `speedscope.app`
113
+
-[ ] Поюзать `stackprof` со `speedscope` и `cli`
104
114
-[ ] Профилировать работающий процесс `rbspy`;
105
-
-[ ] Добавить в программу `ProgressBar`;
106
-
-[ ] Постараться довести асимптотику до линейной и проверить это тестом;
107
-
-[ ] Написать простой тест на время работы: когда вы придёте к оптимизированному решению, замерьте, сколько оно будет работать на тестовом объёме данных; и напишите тест на то, что это время не превышается (чтобы не было ложных срабатываний, задайте время с небольшим запасом);
115
+
-[ ] Попробовать `vernier`
116
+
-[ ] Постараться довести асимптотику до линейной и написать на это `assert`;
117
+
118
+
## Second Thread - Reaper
119
+
-[ ] По фану можно завести второй тред, который будет убивать процесс, если прошло больше 30 секунд
108
120
109
121
### Главное
122
+
110
123
Нужно потренироваться методично работать по схеме с фидбек-лупом:
111
124
- построили отчёт каким-то из профилировщиков
112
125
- осознали его
@@ -117,3 +130,9 @@ head -n N data_large.txt > dataN.txt # create smaller file from larger (take N f
117
130
- записали полученные результаты
118
131
- закоммитились
119
132
- перешли к следующей итерации
133
+
134
+
### PS
135
+
136
+
**Не комитьте пожалуйста много файлов типа дампов профилировщиков или усечённых data.txt**
137
+
138
+
**Самое главное в этом задании это case-study, и на втором месте ruby-код.**
0 commit comments