Skip to content
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

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
Open

Conversation

beglov
Copy link

@beglov beglov commented Apr 27, 2024

Запуск программы на обработку файла data_large.txt:

$ ruby task-1.rb 
Work data_large finish in 30.44

Copy link
Collaborator

@spajic spajic left a 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 секунд
Copy link
Collaborator

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 секунд
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Хоршо подбирать объём данных так, чтобы программа успевала покрутиться пару секунд. Если она завершается слишком быстро (“не успевает поработать”) могут возникнуть какие-то перекосы (например, на полном объёме основная часть времени тратится в основном цикле, а если данных мало - то большая часть уходит на инициализацию и финализацию, например на чтение из файла и запись потом в файл)

И плюс когда время уже на миллисекунды - больше влияние погрешностей.

Copy link
Author

@beglov beglov May 1, 2024

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
Copy link
Collaborator

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"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

это очень мало, не надёжно из-за погрешностей

Copy link
Author

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
Copy link
Collaborator

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(', ')
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

можно SortedSet

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ruby/set#2 - говорят, что выпилили из-за низкой производительности

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants