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

scherbakov task #136

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

Conversation

renegadeneverdies
Copy link

тут всего 2 коммита потому что я сделал прикол с распаковкой. у гитхаба ограничение на 100мб, а я закоммитил файл data_large.txt, он уже был в истории, и я не нашел ничего лучше чем создать новую ветку, перенести изменения и сделать merge --no-ff

- как вы решили её оптимизировать
- как изменилась метрика
- как изменился отчёт профилировщика - исправленная проблема перестала быть главной точкой роста?
- Больше всего времени(21%) занимает метод collect_stats_from_users, в частности Date.parse все тормозит.
Copy link
Collaborator

Choose a reason for hiding this comment

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

На самом деле самое проблемное место Array.select, где N^2 проходов по массиву в поисках сессий

- как изменился отчёт профилировщика - исправленная проблема перестала быть главной точкой роста?
- Больше всего времени(21%) занимает метод collect_stats_from_users, в частности Date.parse все тормозит.
- Посмотрел входные данные - увидел, что формат даты всегда одинаковый. значит вместо Date.parse можно использовать парсер, которому не нужно угадывать формат.
Заменил Date.parse(d) на Date.new(*d.split('-'))
Copy link
Collaborator

Choose a reason for hiding this comment

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

с датой можно вообще ничего не делать

то можно считать, что улучшилось на 200. set реально работает

### Ваша находка №5
- помимо метода readlines оставшееся время съедает некий Array.each... их в общем то в коде много, надо подумать как уменьшить проходы по спискам
Copy link
Collaborator

Choose a reason for hiding this comment

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

в таких случаях желательно уточнить, какой именно из вызовов each самый проблемный (или map, или ещё что-то)

- доля времени write выросла, each уменьшилась. большой файл все еще не читается

### Ваша находка №6
- в цикле users.each происходит еще один цикл users.select. это я глазом заметил и тут я начинаю подозревать, что ruby_prof мне выдает просто рандомные числа,
Copy link
Collaborator

Choose a reason for hiding this comment

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

возможно у вас слишком маленький объём данных был для профилирования? практически все первым же делом видят, что array.select на первом месте с большим отрывом


*Какими ещё результами можете поделиться*

## Защита от регрессии производительности
Для защиты от потери достигнутого прогресса при дальнейших изменениях программы *о performance-тестах, которые вы написали*

Для защиты от потери достигнутого прогресса при дальнейших изменениях программы добавил тест, проверяющий выполняется ли программа менее чем за минуту.
Copy link
Collaborator

Choose a reason for hiding this comment

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

да, если сделать алгоритм линейным, то можно аппроксимировать и сказать, что тест будет ок в случае если он обрабатывает 1/100 данных за 0.3с.

0.31 0.000 0.000 0.000 0.000 3 Array#sum
0.28 0.000 0.000 0.000 0.000 1 Exception#initialize
0.19 0.000 0.000 0.000 0.000 1 Exception#backtrace
0.16 0.000 0.000 0.000 0.000 1 Exception#exception
Copy link
Collaborator

Choose a reason for hiding this comment

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

что-то у вас не то с профилированием. Мб exception где-то происходил во время работы программы?

кол-ва calls очень маленькие. Если взять файл хотя бы на 10000 строк, и программа всё обрабатывает, то должны быть тысячи вызовов, а у вас их прям по несколько штук

end
end
require 'oj'
require 'English'
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.

это я хотел использовать oj для записи в файл, но метод Oj.to_file не добавлял в конце \n. я добавил его как #{$/}, а мне рубокоп Style::SpecialGlobalVars указа, что нужно использовать English

'browsers' => browsers.map(&:upcase).sort.join(', '),
'usedIE' => browsers.any? { |b| b.upcase.include?('INTERNET EXPLORER') },
'alwaysUsedChrome' => browsers.all? { |b| b.upcase.include?('CHROME') },
'dates' => sessions.map { |s| s['date'] }.map { |d| Date.new(*d.split('-').map(&:to_i)) }.sort.reverse.map(&:iso8601)
Copy link
Collaborator

Choose a reason for hiding this comment

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

с датой не надо на самом деле ничего делать

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.

2 participants