|
11 | 11 |
|
12 | 12 | Я решил исправить эту проблему, оптимизировав эту программу.
|
13 | 13 |
|
| 14 | +Для начала я запустил небольшой бенчмарк, чтобы понять, какая асимптотика у программы. Для каждого измерения взял первые `n` строк из файла с полными данными. Результаты бенчмарка выглядели так: |
| 15 | + |
| 16 | +``` |
| 17 | + user system total real |
| 18 | +line_count = 10 0.001417 0.000258 0.001675 ( 0.011769) |
| 19 | +line_count = 50 0.001417 0.000258 0.001675 ( 0.011346) |
| 20 | +line_count = 100 0.002608 0.000000 0.002608 ( 0.013075) |
| 21 | +line_count = 500 0.002582 0.009544 0.012126 ( 0.022563) |
| 22 | +line_count = 1000 0.009544 0.010132 0.019676 ( 0.030331) |
| 23 | +line_count = 5000 0.218717 0.020935 0.239652 ( 0.253703) |
| 24 | +line_count = 10000 0.979160 0.000000 0.979160 ( 1.010272) |
| 25 | +line_count = 20000 4.887525 0.017847 4.905372 ( 4.930110) |
| 26 | +line_count = 30000 13.817134 0.099889 13.917023 ( 13.935027) |
| 27 | +line_count = 40000 29.488743 0.109932 29.598675 ( 29.619598) |
| 28 | +line_count = 50000 50.501303 0.109971 50.611274 ( 50.648952) |
| 29 | +``` |
14 | 30 | График зависимости времени работы программы от объёма входных данных выглядел так:
|
15 | 31 |
|
16 | 32 | 
|
17 | 33 |
|
18 |
| -Судя по графику, программа работала с асимптотикой `O(n^2)`, что неудивительно, ведь в ней был вложенный цикл. |
| 34 | +Судя по графику, программа работала с асимптотикой `O(n^2)`. |
19 | 35 |
|
20 | 36 | ## Формирование метрики
|
21 | 37 | Для того, чтобы понимать, дают ли мои изменения положительный эффект на быстродействие программы я придумал использовать такую метрику: время работы программы на полном объёме данных.
|
|
26 | 42 | ## Feedback-Loop
|
27 | 43 | Для того, чтобы иметь возможность быстро проверять гипотезы я выстроил эффективный `feedback-loop`, который позволил мне получать обратную связь по эффективности сделанных изменений за *время, которое у вас получилось*
|
28 | 44 |
|
29 |
| -Вот как я построил `feedback_loop`: *как вы построили feedback_loop* |
| 45 | +Вот как я построил `feedback_loop`: |
| 46 | +1. Запуск профилировщик `rbspy` на малом объёме данных. |
| 47 | +2. Анализ отчёта профилировщика и выявление главной точки роста. |
| 48 | +3. Оптимизация главной точки роста. |
| 49 | +4. Запуск теста идущего в комплекте с программой. |
| 50 | +5. Запуск бенчмарка на малых объёмах данных и проверка попадания в бюджет. |
| 51 | +6. Закрепление изменений в системе контроля версий. |
| 52 | +7. Обновление бюджета в бенчмарке. |
30 | 53 |
|
31 | 54 | ## Вникаем в детали системы, чтобы найти главные точки роста
|
32 | 55 | Для того, чтобы найти "точки роста" для оптимизации я воспользовался *инструментами, которыми вы воспользовались*
|
33 | 56 |
|
34 | 57 | Вот какие проблемы удалось найти и решить
|
35 | 58 |
|
36 |
| -### Ваша находка №1 |
37 |
| -- какой отчёт показал главную точку роста |
38 |
| -- как вы решили её оптимизировать |
39 |
| -- как изменилась метрика |
40 |
| -- как изменился отчёт профилировщика - исправленная проблема перестала быть главной точкой роста? |
| 59 | +### Итерация №1 |
| 60 | +- Использовался отчёт профилировщика `rbspy` при запуске на файле с 10000 строк. Отчёт показал, что больше всего времени программа тратит на выборку сессий по пользователю из массива сессий. |
| 61 | +- Было принято решение вынести эту строку из цикла и вместо этого выполнить `Array#group_by`. |
| 62 | +- Время выполнения программы на файле с 10000 строками уменьшилось с 1.010272 до 0.283054 секунды. |
| 63 | +- Также уменьшилось время выполнения программы на файлах большего размера. |
| 64 | + ``` |
| 65 | + user system total real |
| 66 | + line_count = 11 0.001461 0.000487 0.001948 ( 0.012805) |
| 67 | + line_count = 51 0.002695 0.000898 0.003593 ( 0.009555) |
| 68 | + line_count = 100 0.003591 0.001197 0.004788 ( 0.010995) |
| 69 | + line_count = 501 0.006650 0.000000 0.008918 ( 0.019601) |
| 70 | + line_count = 1000 0.012564 0.000000 0.015094 ( 0.029157) |
| 71 | + line_count = 5000 0.050438 0.019783 0.073774 ( 0.103414) |
| 72 | + line_count = 10000 0.160801 0.000000 0.170127 ( 0.283054) |
| 73 | + line_count = 20001 0.400933 0.048675 0.455922 ( 0.547208) |
| 74 | + line_count = 30000 0.637398 0.019211 0.666364 ( 0.770074) |
| 75 | + line_count = 40000 0.978085 0.010174 1.003803 ( 1.200759) |
| 76 | + line_count = 50000 1.290851 0.019795 1.325995 ( 1.518988) |
| 77 | + ``` |
| 78 | +- График зависимости времени работы программы от объёма входных данных стал выглядеть так (синие точки): |
| 79 | + |
| 80 | +  |
| 81 | +  |
| 82 | + Судя по изменившейся форме графика можно сделать вывод, что асимптотика стала линейной в данном диапазоне обрабатываемых строкб возможно на более крупном масштабе мы увидим ещё одну степенную асимптоту. |
| 83 | +- Отчёт профилировщика изменился значительно: исправленная проблема перестала быть главной точкой роста, время подключения библиотек стало основным. |
41 | 84 |
|
42 | 85 | ### Ваша находка №2
|
43 | 86 | - какой отчёт показал главную точку роста
|
|
0 commit comments