В нашем проекте возникла серьёзная проблема.
Необходимо было обработать файл с данными, чуть больше ста мегабайт.
У нас уже была программа на ruby
, которая умела делать нужную обработку.
Она успешно работала на файлах размером пару мегабайт, но для большого файла она работала слишком долго, и не было понятно, закончит ли она вообще работу за какое-то разумное время.
Я решил исправить эту проблему, оптимизировав эту программу.
Для того, чтобы понимать, дают ли мои изменения положительный эффект на быстродействие программы я придумал использовать такую метрику: время выполнения & использование памяти на момент завершения скрипта для инпута в 10к, 50к и 100к Значения до оптимизации: 10к - 34MB , 0.3s 50k - 42MB , 1.55s 100k - 56MB , 2.95s data_large - 528MB, 103s
Программа поставлялась с тестом. Выполнение этого теста в фидбек-лупе позволяет не допустить изменения логики программы при оптимизации.
Для того, чтобы иметь возможность быстро проверять гипотезы я выстроил эффективный feedback-loop
, который позволил мне получать обратную связь по эффективности сделанных изменений за 5-10 секунд
Вот как я построил feedback_loop
: создал несколько спеков для проверки перформанса на инпуте в 10к, 50к и 100к строк
Для того, чтобы найти "точки роста" для оптимизации я воспользовался memory_profiler, ruby-prof, stackprof & valgrind
Вот какие проблемы удалось найти и решить
- какой отчёт показал главную точку роста
- как вы решили её оптимизировать
- как изменилась метрика
- как изменился отчёт профилировщика
- какой отчёт показал главную точку роста
- как вы решили её оптимизировать
- как изменилась метрика
- как изменился отчёт профилировщика
- какой отчёт показал главную точку роста
- как вы решили её оптимизировать
- как изменилась метрика
- как изменился отчёт профилировщика
В результате проделанной оптимизации наконец удалось обработать файл с данными. Удалось улучшить метрику системы с того, что у вас было в начале, до того, что получилось в конце и уложиться в заданный бюджет.
Какими ещё результами можете поделиться
Для защиты от потери достигнутого прогресса при дальнейших изменениях программы о performance-тестах, которые вы написали