Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
to a large audience (ideally all users of OctoPrint)
made sure your changes don't interfere with current development by
talking it through with the maintainers, e.g. through a
Brainstorming ticket
new feature, or maintenance if it's a bug fix or improvement of
existing functionality for the current stable version (no PRs
against master or anything else please)
(no PRs from your version of master, maintenance or devel please),
e.g. dev/my_new_feature or fix/my_bugfix
no dead code, ideally only one commit - rebase and squash your PR
if necessary!
.less source files, not the .css files (those are generated with
lessc)
have added unit tests
nothing broke
What does this PR do and why is it necessary?
Two performance improvements that came as a result of profiling OctoPrint. My primary goal has been to reduce the CPU impact when it comes to serving /. All performance numbers I'm reporting here are from running using python 3.7.5 on my 2016 Macbook Pro. I expect the improvements to be even more significant on a typical raspberry pi.
1. Improve performance of etag calculation for / (root route):
isdir
orisfile
incollect_files
.compute_lastmodified
to stat files, which tells us if the path exists, if it is a file, and it's last modified.stat
system calls. This has a bigger impact on raspberry PI systems.Timing (as reported by Tornado) on my 2016 Macbook Pro when fetching / (
curl -o /dev/null http://octoprint/
):2. Memoize settings hashes to speed up cache refresh:
Memoize
settings.config_hash
andsettings.effective_hash
. Thehashes will only be calculated on the first call to the respective
functions. These memoized values are invalidated when the settings
object becomes dirty, or the settings are loaded from the config file.
Reason for change: During a refresh of the root route (/), the hash of
settings.effective.yaml
is calculated 5 times. Each call lead to alarge configuration object to be serialized to a YAML string, which would
then be hashed. As it turns out, serializing to YAML is expensive.
Note: while I do not see
settings.config_hash
hit during a refresh,but making a change to it was easy and appropriate. It's possible that
other areas of the application may see some benefit.
Performance (on my 2016 Macbook Pro:
http://octoprint/?_refresh=1
How was it tested? How can it be tested by the reviewer?
Manually.
I ran pytest, and everything passes.
Any background context you want to provide?
What are the relevant tickets if any?
Screenshots (if appropriate)
Further notes