-
Notifications
You must be signed in to change notification settings - Fork 177
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Optimization ruby program #138
base: master
Are you sure you want to change the base?
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
### Находка №1 - Не эффективное получение сессий пользователя | ||
- увидел в flat отчете ruby-prof-а | ||
- для ускорения работы я решил сформировать на этапе парсинга файла хэш с ключом по ИД пользователя который будет хранить все сессии конкретного пользователя | ||
- время выполнения снизилось c 22.8 до 1.05 секунд |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Да, и тут самое ещё приятное, что асимптотика качественно улучшается и приближается к линейной.
### Находка №3 - Не эффективный подсчёт количества уникальных браузеров | ||
- видно в callstack отчете ruby-prof-а | ||
- можно использовать хэш у которого в качестве ключей будут названия браузеров | ||
- время выполнения снизилось c 0.7 до 0.53 секунд |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Хоршо подбирать объём данных так, чтобы программа успевала покрутиться пару секунд. Если она завершается слишком быстро (“не успевает поработать”) могут возникнуть какие-то перекосы (например, на полном объёме основная часть времени тратится в основном цикле, а если данных мало - то большая часть уходит на инициализацию и финализацию, например на чтение из файла и запись потом в файл)
И плюс когда время уже на миллисекунды - больше влияние погрешностей.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Возникали аналогичные мысли, но все же не стал менять объем входных данных в процессе оптимизации программы, т.к. тогда не будет отслеживаться как изменилось время обработки изначально выбранного объёма данных
+ изначально все же была выбрана метрика "время обработки программой файла размером 40000 строк" и показалось правильным не менять её в процессе оптимизации программы
end | ||
|
||
report['uniqueBrowsersCount'] = uniqueBrowsers.count | ||
report['uniqueBrowsersCount'] = uniqueBrowsers.keys.size |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Можно просто Set и set.size
time = Benchmark.realtime do | ||
work | ||
end | ||
assert time < 0.0004, "The Ruby method took more than 0.0004 seconds to execute" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
это очень мало, не надёжно из-за погрешностей
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Да, пожалуй. Но в тоже время не хотелось сильно замедлять прогон тестов, что будет особенно актуально на рабочем проекте, где прогон тестов уже может проходить довольно долго.
end | ||
|
||
def dates | ||
@dates ||= @sessions.map { |s| s['date'] }.sort.reverse |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
обратите внимание, что map создаёт второй массив, sort - второй, а reverse - третий
end | ||
|
||
def browsers | ||
@browsers ||= upcase_browsers.sort.join(', ') |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
можно SortedSet
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ruby/set#2 - говорят, что выпилили из-за низкой производительности
Запуск программы на обработку файла
data_large.txt
: