|
17 | 17 | - Добиться того, чтобы программа корректно обработала файл `data_large.txt` за `30 секунд`;
|
18 | 18 | - Написать кейс-стади о вашей оптимизации по шаблону `case-study-template.md`.
|
19 | 19 |
|
| 20 | +Case-study должен получиться рассказом с техническими подробностями о том как вы пришли к успеху в оптимизации. Можно сказать, заготовкой статьи на Хабр/Medium/... |
| 21 | + |
20 | 22 | ## Сдача задания
|
21 | 23 | Для сдачи задания нужно форкнуть этот проект, сделать `PR` в него и прислать ссылку для проверки.
|
22 | 24 |
|
|
27 | 29 |
|
28 | 30 | # Комментарии
|
29 | 31 |
|
30 |
| -## Какую пользу нужно получить от этого задания |
| 32 | +## Риски |
31 | 33 | Задание моделирует такую ситуацию: вы получили неффективную систему, в которой код и производительность оставляет желать лучшего. При этом актуальной проблемой является именно производительность.
|
32 | 34 | Вам нужно оптимизировать эту систему.
|
33 | 35 |
|
|
39 | 41 | Их риски:
|
40 | 42 | - перед рефакторингом “очевидных” косяков не написать тестов и незаметно внести регрессию;
|
41 | 43 | - потратить время на рефакторинг, хотя время было только на оптимизацию;
|
42 |
| -- исправить все очевидные на глаз проблемы производительности, не получить заметного результата, решить что наверное просто Ruby слишком медленный для этой задачи |
| 44 | +- исправить все очевидные на глаз проблемы производительности, не получить заметного результата, решить что наверное просто Ruby слишком медленный для этой задачи, демотивироваться и разочароваться в попытках оптимизации |
43 | 45 |
|
44 | 46 | ## Советы
|
45 | 47 | - Найдите объём данных, на которых программа отрабатывает достаточно быстро - это позволит вам выстроить фидбек-луп; если улучшите метрику для части данных, то улучшите и для полного объёма данных;
|
46 | 48 | - Попробуйте прикинуть ассимтотику роста времени работы в зависимости от объёма входных данных (попробуйте объём x, 2x, 4x, 8x)
|
47 | 49 | - Оцените, как долго программа будет обрабатывать полный обём данных
|
48 | 50 | - Оцените, сколько времени занимает работа GC (попробовав отключить его на небольшом объёме данных)
|
49 | 51 |
|
| 52 | +### Совет: как посчитать кол-во строк в файле |
| 53 | +``` |
| 54 | +wc -l data_large.rb # (3250940) total line count |
| 55 | +``` |
| 56 | + |
| 57 | +### Совет: как создать меньший файл из большего, оставив перевые N строк |
| 58 | +``` |
| 59 | +head -n N data_large.txt > dataN.txt # create smaller file from larger (take N first lines) |
| 60 | +``` |
| 61 | + |
50 | 62 | ## Что можно делать
|
51 | 63 | - рефакторить код
|
52 | 64 | - рефакторить/дописывать тесты
|
|
56 | 68 | - исследовать предложенную вам на рассмотрение систему
|
57 | 69 | - построить фидбек-луп, который позволит вам быстро тестировать гипотезы и измерять их эффект
|
58 | 70 | - применить инструменты профилирования CPU, чтобы найти главные точки роста
|
59 |
| -- выписывать в case-study несколько пунктов: каким профилировщиком вы нашли точку роста, как её оптимизировали, какой получили прирост метрики; |
| 71 | +- выписывать в case-study несколько пунктов: каким профилировщиком вы нашли точку роста, как её оптимизировали, какой получили прирост метрики, как найденная проблема перестала быть главной точкой роста; |
60 | 72 |
|
61 | 73 | ## Что не нужно делать
|
62 | 74 | - переписывать с нуля
|
|
70 | 82 | - как с помощью профилировщиков нашли что именно даст вам наибольший эффект (главную точку роста)
|
71 | 83 | - как быстро протестировали гипотезу, получили измеримый результат и зафиксировали его
|
72 | 84 | - как в итоге написали небольшой отчёт об успешных шагах этого процесса
|
73 |
| -инструментов профилирования `CPU` и разъяснений, сделанных на 2й лекции. |
74 | 85 |
|
75 | 86 | ## Checklist
|
76 |
| -- Построить и проанализировать отчёт `ruby-prof` в режиме `Flat`; |
77 |
| -- Построить и проанализировать отчёт `ruby-prof` в режиме `Graph`; |
78 |
| -- Построить и проанализировать отчёт `ruby-prof` в режиме `CallStack`; |
79 |
| -- Построить и проанализировать отчёт `ruby-prof` в режиме `CallTree` c визуализацией в `QCachegrind`; |
80 |
| -- Профилировать работающий процесс `rbspy`; |
81 |
| -- Построить и проанализировать отчёт `flamegraph` с помощью `rbspy`; |
82 |
| -- Добавить в программу `ProgressBar`; |
83 |
| -- Постараться довести асимптотику до линейной и проверить это тестом; |
84 |
| -- Написать простой тест на время работы: когда вы придёте к оптимизированному решению, замерьте, сколько оно будет работать на тестовом объёме данных; и напишите тест на то, что это время не превышается (чтобы не было ложных срабатываний, задайте время с небольшим запасом); |
| 87 | +- [ ] Прикинуть ассимпотику зависимости времени работы програмы от размера обрабатываемого файла |
| 88 | +- [ ] Построить и проанализировать отчёт `ruby-prof` в режиме `Flat`; |
| 89 | +- [ ] Построить и проанализировать отчёт `ruby-prof` в режиме `Graph`; |
| 90 | +- [ ] Построить и проанализировать отчёт `ruby-prof` в режиме `CallStack`; |
| 91 | +- [ ] Построить и проанализировать отчёт `ruby-prof` в режиме `CallTree` c визуализацией в `QCachegrind`; |
| 92 | +- [ ] Построить дамп `stackprof` и проанализировать его с помощью `CLI` |
| 93 | +- [ ] Построить дамп `stackprof` в `json` и проанализировать его с помощью `speedscope.app` |
| 94 | +- [ ] Профилировать работающий процесс `rbspy`; |
| 95 | +- [ ] Добавить в программу `ProgressBar`; |
| 96 | +- [ ] Постараться довести асимптотику до линейной и проверить это тестом; |
| 97 | +- [ ] Написать простой тест на время работы: когда вы придёте к оптимизированному решению, замерьте, сколько оно будет работать на тестовом объёме данных; и напишите тест на то, что это время не превышается (чтобы не было ложных срабатываний, задайте время с небольшим запасом); |
85 | 98 |
|
86 | 99 | ### Главное
|
87 | 100 | Нужно потренироваться методично работать по схеме с фидбек-лупом:
|
88 | 101 | - построили отчёт каким-то из профилировщиков
|
89 | 102 | - осознали его
|
90 | 103 | - поняли, какая самая большая точка роста
|
91 | 104 | - внесли минимальные изменения, чтобы использовать только эту точку роста
|
92 |
| -- перестроили отчёт, убедились, что проблема решена |
93 | 105 | - вычислили метрику - оценили, как изменение повлияло на метрику
|
| 106 | +- перестроили отчёт, убедились, что проблема решена |
94 | 107 | - записали полученные результаты
|
95 | 108 | - закоммитились
|
96 | 109 | - перешли к следующей итерации
|
0 commit comments