Skip to content

Commit bca675e

Browse files
committed
Update readme
1 parent 3f9982d commit bca675e

File tree

1 file changed

+62
-43
lines changed

1 file changed

+62
-43
lines changed

README.md

+62-43
Original file line numberDiff line numberDiff line change
@@ -1,112 +1,125 @@
1-
### Note
2-
*Для работы скрипта требуется Ruby 2.4+*
3-
41
# Задание №1
5-
В файле `task-1.rb` находится ruby-программа, которая выполняет обработку данных из файла.
62

7-
В файл встроен тест, который показывает, как программа должна работать.
3+
В файле `task1.rb` находится ruby-программа, которая выполняет обработку данных из файла.
4+
5+
При запуске `ruby task1.rb` запускается тест, который показывает как программа должна работать.
6+
7+
С помощью этой программы нужно обработать файл с данными `data_large.txt`.
88

9-
С помощью этой программы нужно обработать файл данных `data_large.txt`.
109

1110
**Проблема в том, что это происходит слишком долго, дождаться пока никому не удавалось.**
1211

1312

1413
## Задача
15-
- Оптимизировать эту программу, выстроив процесс согласно "общему фреймворку оптимизации" из первой лекции;
16-
- Профилировать программу с помощью инструментов, с которыми мы познакомились в первой лекции;
14+
15+
- Оптимизировать эту программу, выстроив процесс согласно "общему фреймворку оптимизации" из первой презентации;
16+
- Профилировать программу с помощью `stackprof` и `ruby-prof`, (можно ещё попробовать `vernier`);
1717
- Добиться того, чтобы программа корректно обработала файл `data_large.txt` за `30 секунд`;
1818
- Написать кейс-стади о вашей оптимизации по шаблону `case-study-template.md`.
1919

20-
Case-study должен получиться рассказом с техническими подробностями о том как вы пришли к успеху в оптимизации. Можно сказать, заготовкой статьи на Хабр/Medium/...
20+
Case-study должен получиться рассказом с техническими подробностями о том как вы пришли к успеху в оптимизации благодаря системному подходу. Можно сказать, заготовкой технической статьи.
2121

2222
## Сдача задания
23-
Для сдачи задания нужно форкнуть этот проект, сделать `PR` в него и прислать ссылку для проверки.
2423

25-
В `PR`
26-
- должны быть внесены оптимизации в `task-1.rb`;
24+
Надо сделать `PR` в этот репозиторий и прислать его для проверки.
25+
26+
В `PR`
27+
- должны быть внесены оптимизации в `task1.rb`;
2728
- должен быть файл `case-study.md` с описанием проделанной оптимизации;
2829

2930

3031
# Комментарии
3132

3233
## Риски
33-
Задание моделирует такую ситуацию: вы получили неффективную систему, в которой код и производительность оставляет желать лучшего. При этом актуальной проблемой является именно производительность.
34-
Вам нужно оптимизировать эту систему.
34+
35+
Задание моделирует такую ситуацию: вы получили неффективную систему, в которой код и производительность оставляет желать лучшего. При этом актуальной проблемой является именно плохая производительность.
36+
Вам нужно оптимизировать эту незнакомую систему.
3537

3638
С какими искушениями вы сталкиваететь:
3739
- вы “с ходу” замечаете какие-то непроизводительные идиомы, и у вас возникает соблазн их сразу исправить;
40+
- попытаться в уме очень вникнуть в работу программы, как будто просветить её микроскопом, превратиться в компилятор
3841

39-
Эти искушения типичны и часто возникают в моделируемой ситуации.
42+
Эти искушения типичны и часто возникают в моделируемой ситуации, но есть риски:
4043

41-
Их риски:
4244
- перед рефакторингом “очевидных” косяков не написать тестов и незаметно внести регрессию;
4345
- потратить время на рефакторинг, хотя время было только на оптимизацию;
44-
- исправить все очевидные на глаз проблемы производительности, не получить заметного результата, решить что наверное просто Ruby слишком медленный для этой задачи, демотивироваться и разочароваться в попытках оптимизации
46+
- исправить на глаз замеченные/предположенные проблемы, не получить заметного результата, решить что наверное просто Ruby слишком медленный для этой задачи, демотивироваться
4547

4648
## Советы
47-
- Найдите объём данных, на которых программа отрабатывает достаточно быстро - это позволит вам выстроить фидбек-луп; если улучшите метрику для части данных, то улучшите и для полного объёма данных;
48-
- Попробуйте прикинуть ассимтотику роста времени работы в зависимости от объёма входных данных (попробуйте объём x, 2x, 4x, 8x)
49+
50+
- Найдите объём данных, на которых программа отрабатывает достаточно быстро - это позволит вам выстроить фидбек-луп; если улучшите метрику для части данных, то улучшите и для полного объёма данных; *оптимально давать программе покрутиться секунд 5; слишком мало тоже нехорошо для профилирования и бенчмаркинга*
51+
- Попробуйте прикинуть ассимтотику роста времени работы в зависимости от объёма входных данных (попробуйте объём x, 2x, 3x, ...)
4952
- Оцените, как долго программа будет обрабатывать полный обём данных
50-
- Оцените, сколько времени занимает работа `GC` (попробовав отключить его на небольшом объёме данных)
5153
- Вкладывайтесь в удобство работы и скорость получения обратной связи, сделайте себе эффективный фидбек-луп
5254

5355
### Советы по профилированию и измерению метрики
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 не смешивайте профилирование и бенчмаркинг
5965

6066
### Совет: как посчитать кол-во строк в файле
67+
6168
```
6269
wc -l data_large.rb # (3250940) total line count
6370
```
6471

6572
### Совет: как создать меньший файл из большего, оставив перевые N строк
73+
6674
```
6775
head -n N data_large.txt > dataN.txt # create smaller file from larger (take N first lines)
6876
```
6977

70-
## Что можно делать
71-
- рефакторить код
72-
- рефакторить/дописывать тесты
73-
- разбивать скрипт на несколько файлов
74-
7578
## Что нужно делать
79+
7680
- исследовать предложенную вам на рассмотрение систему
7781
- построить фидбек-луп, который позволит вам быстро тестировать гипотезы и измерять их эффект
7882
- применить инструменты профилирования CPU, чтобы найти главные точки роста
7983
- выписывать в case-study несколько пунктов: каким профилировщиком вы нашли точку роста, как её оптимизировали, какой получили прирост метрики, как найденная проблема перестала быть главной точкой роста;
8084

85+
8186
## Что не нужно делать
87+
8288
- переписывать с нуля
8389
- забивать на выстраивание фидбек-лупа
8490
- вносить оптимизации по наитию, без профилировщика и без оценки эффективности
91+
- смешивать несколько изменений в одну итерацию
92+
93+
## Что можно делать
94+
95+
- рефакторить код
96+
- рефакторить/дописывать тесты
97+
- разбивать скрипт на несколько файлов
8598

8699
## Основная польза задания
87-
Главная польза этого задания - попрактиковаться в применении грамотного подхода к оптимизации, почуствовать этот процесс:
100+
101+
Главная польза этого задания - попрактиковаться в применении грамотного и системного подхода к оптимизации, почуствовать этот процесс:
88102
- как взяли незнакомую систему и исследовали её
89103
- как выстроили фидбек луп
90-
- как с помощью профилировщиков нашли что именно даст вам наибольший эффект (главную точку роста)
104+
- как с помощью профилировщиков сформировали гипотезу о том что именно даст вам наибольший эффект (главную точку роста)
91105
- как быстро протестировали гипотезу, получили измеримый результат и зафиксировали его
92-
- как в итоге написали небольшой отчёт об успешных шагах этого процесса
106+
- как в итоге написали небольшой журнал об успешных шагах этого процесса
107+
108+
## Extended Checklist
93109

94-
## Checklist
95110
Советую использовать все рассмотренные в лекции инструменты хотя бы по разу - попрактикуйтесь с ними, научитесь с ними работать.
96111

97112
- [ ] Прикинуть зависимость времени работы програмы от размера обрабатываемого файла
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`
104114
- [ ] Профилировать работающий процесс `rbspy`;
105-
- [ ] Добавить в программу `ProgressBar`;
106-
- [ ] Постараться довести асимптотику до линейной и проверить это тестом;
107-
- [ ] Написать простой тест на время работы: когда вы придёте к оптимизированному решению, замерьте, сколько оно будет работать на тестовом объёме данных; и напишите тест на то, что это время не превышается (чтобы не было ложных срабатываний, задайте время с небольшим запасом);
115+
- [ ] Попробовать `vernier`
116+
- [ ] Постараться довести асимптотику до линейной и написать на это `assert`;
117+
118+
## Second Thread - Reaper
119+
- [ ] По фану можно завести второй тред, который будет убивать процесс, если прошло больше 30 секунд
108120

109121
### Главное
122+
110123
Нужно потренироваться методично работать по схеме с фидбек-лупом:
111124
- построили отчёт каким-то из профилировщиков
112125
- осознали его
@@ -117,3 +130,9 @@ head -n N data_large.txt > dataN.txt # create smaller file from larger (take N f
117130
- записали полученные результаты
118131
- закоммитились
119132
- перешли к следующей итерации
133+
134+
### PS
135+
136+
**Не комитьте пожалуйста много файлов типа дампов профилировщиков или усечённых data.txt**
137+
138+
**Самое главное в этом задании это case-study, и на втором месте ruby-код.**

0 commit comments

Comments
 (0)