Conversation
| Я решил исправить эту проблему, оптимизировав эту программу. | ||
|
|
||
| ## Формирование метрики | ||
| Для того, чтобы понимать, дают ли мои изменения положительный эффект на быстродействие программы я придумал использовать такую линейную метрику, чтобы программа отрабатывала за линейное время выполнения в зависимости от размера входных данных. |
There was a problem hiding this comment.
Это не "метрика", это асимптотика. Метрика == число, вроде кол-во секунд или кол-во мегабайт, или кол-во IPS, ...
| Программа поставлялась с тестом. Выполнение этого теста в фидбек-лупе позволяет не допустить изменения логики программы при оптимизации. | ||
|
|
||
| ## Feedback-Loop | ||
| Для того, чтобы иметь возможность быстро проверять гипотезы я выстроил эффективный `feedback-loop`, который позволил мне получать обратную связь по эффективности сделанных изменений за 0.84551 сек. |
| - expected block to perform linear, but performed exponential | ||
| - expected block to perform linear, but performed logarithmic | ||
| - expected block to perform linear, but performed power | ||
| Любые, но не линейная |
There was a problem hiding this comment.
)) но кстати logarithmic - это лучше чем линейная
| ### Находка №2 | ||
| - Опять же с помощью Flat увидел, что следующей точкой роста стал метод all?, котоый использовался при вычислении уникальных браузеров, вложенная цикличность | ||
| - Заменил эту вложенную цикличность each + all? на одиночный проход map и выборкой всех уникальных значений | ||
| - Для 10000 строк стало отрабатывать за 0.001084 сек. - было 0.196914 сек. -> в 180 раз? Вышел сильный прирост для небольшого объема данных |
There was a problem hiding this comment.
при профилировании лучше давать программе поработать пару секунд хотя бы, чтобы уменьшить влияние погрешностей и дать покрутиться в основном цикле (если он есть)
| - Для 10000 строк стало отрабатывать за 0.001084 сек. - было 0.196914 сек. -> в 180 раз? Вышел сильный прирост для небольшого объема данных | ||
| - Отчет профилировщика изменился, исправленная проблема перестала быть главной точкой роста | ||
|
|
||
| Так как для 10000 отрабатывает теперь очень быстро, изменил и увеличил Feedback-Loop, теперь стало отрабатывать для 100000 строк за 4.852382 сек, остановился на этом. |
| Так как для 10000 отрабатывает теперь очень быстро, изменил и увеличил Feedback-Loop, теперь стало отрабатывать для 100000 строк за 4.852382 сек, остановился на этом. | ||
|
|
||
| ### Находка №3 | ||
| - Тем же Flat профилировщиком увидел, что следующей тяжелой операцией является сложение массивов, т.е. метод "+", который вызывается при первом же each, где в массив собираются сессии и пользователи |
There was a problem hiding this comment.
Flat это не профилировщик, а отчёт (просто обращаю внимание)
|
|
||
| ### Находка №4 | ||
| - Flat профилировщиком показал, что следующая точка роста - это each. Для более понятной картины воспользовался CallTreePrinter, так как в древовидной структуре вызовов можно увидеть последовательность и понятное процентное соотношение затрат ресурсов конкретных методов. В метододе each вызываются map, однако их много, но из дерева видно, что трудозатратным в них является парсинг даты(Date.parse) | ||
| - Заменил Date.parse на Date.strptime, так как при парсе даты .strptime является более оптимальным методом |
There was a problem hiding this comment.
с датами можно вообще ничего не делать, это пасхалочка
|
|
||
| Тест benchmark.rb проходит успешно, среднее время трех запусков программ с data_large.txt получается меньше 30 сек, а так же проверка на линейность perform_linear - выполняется | ||
|
|
||
| Если оптимизировать далее, то скорее придется переписывать программу, стараясь уменьшать кол - во итераций в программе. No newline at end of file |
There was a problem hiding this comment.
Во втором задании можно зайти с другой стороны и получить интересные реузльтаты
No description provided.