-
Notifications
You must be signed in to change notification settings - Fork 6k
Made flutter startup faster by allowing initialization to be parallelized #10182
Made flutter startup faster by allowing initialization to be parallelized #10182
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.
Very cool. A couple of nits but looks great.
shell/common/shell.cc
Outdated
fml::AutoResetWaitableEvent io_latch; | ||
std::unique_ptr<ShellIOManager> io_manager; | ||
std::promise<std::unique_ptr<ShellIOManager>> io_manager_promise; | ||
auto io_manager = io_manager_promise.get_future(); |
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.
Here and elsewhere, please append _future
to the ivars or locals that are now futures.
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.
done
shell/common/shell.cc
Outdated
on_create_rasterizer, // | ||
shell = shell.get() // | ||
]() { | ||
TRACE_EVENT0("flutter", "ShellSetupGPUSubsystem"); | ||
if (auto new_rasterizer = on_create_rasterizer(*shell)) { | ||
rasterizer = std::move(new_rasterizer); | ||
rasterizer_promise.set_value(std::move(new_rasterizer)); |
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.
This can just be condensed to one line now: rasterizer_promise.set_value(on_create_rasterizer(...))
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.
done
shell/common/shell.cc
Outdated
|
||
// Create the rasterizer on the GPU thread. | ||
fml::AutoResetWaitableEvent gpu_latch; | ||
std::unique_ptr<Rasterizer> rasterizer; | ||
std::promise<std::unique_ptr<Rasterizer>> rasterizer_promise; |
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.
Please move this before the platform view creation call. You don't have to wait for the platform view to be created before this can be kicked off as there is no dependency. This can be kicked off eagerly so that platform view creation can be concurrent with rasterizer creation as well.
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.
done
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.
Looks great! Do you have some numbers that quantify the improvements of this PR (by probably running some of our start up driver tests locally)? If we don't currently have benchmarks to cover this, we should add some :)
There is shell_benchmarks but those aren't wired up to any dashboard. There are already benchmarks for startup and shutdown that should show improvements after these changes. |
Thanks @chinmaygarde ! @gaaclarke : can you please attach comparison numbers of the benchmarks that Chinmay mentioned in the PR description? (You can also find more "startup" tests in https://github.com/flutter/flutter/blob/master/dev/devicelab/manifest.yaml) |
by reference and it was getted std::moved under the covers.
So 0.055569ms faster shell initialization? |
~15% improvement? I'd ship it. |
I think we should add tests that fully complete |
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.
Fantastic! Please remember to also put the numbers in the merge description so we can find it in git log
. (By default, I think Github won't put your comment in the description.)
@gaaclarke : I think @chinmaygarde 's ~15% calculation is based on |
git@github.com:flutter/engine.git/compare/63873d9f421f...d1692d4 git log 63873d9..d1692d4 --no-merges --oneline 2019-09-17 hterkelsen@users.noreply.github.com Update canvaskit backend (flutter/engine#12318) 2019-09-17 mouad.debbar@gmail.com README for the felt tool (flutter/engine#12323) 2019-09-17 jason-simmons@users.noreply.github.com Fix continuous event polling in the GLFW event loop (flutter/engine#12320) 2019-09-17 15365765+rafern@users.noreply.github.com Tests for #11283 (flutter/engine#12322) 2019-09-17 ditman@gmail.com Improve check to render (or not) a DRRect when inner falls outside of outer on RecordingCanvas (flutter/engine#12229) 2019-09-17 bkonyi@google.com Roll src/third_party/dart dd1969a43a..7505b3a5f0 (39 commits) 2019-09-17 30870216+gaaclarke@users.noreply.github.com Channel buffers (flutter/engine#12167) 2019-09-17 xster@google.com Make iOS FlutterViewController stop sending inactive/pause on app lifecycle events when not visible (flutter/engine#12128) 2019-09-17 stuartmorgan@google.com Adds PluginRegistry to the C++ client wrapper API (flutter/engine#12287) 2019-09-17 liyuqian@google.com Add "type" to getDisplayRefreshRate protocol (flutter/engine#12319) 2019-09-17 mouad.debbar@gmail.com Add a build command to felt (flutter/engine#12303) 2019-09-17 skia-flutter-autoroll@skia.org Roll src/third_party/skia df432d5efb70..d545bfbb94ca (1 commits) (flutter/engine#12316) 2019-09-17 skia-flutter-autoroll@skia.org Roll fuchsia/sdk/core/linux-amd64 from rwf0-... to RRgw-... (flutter/engine#12315) 2019-09-17 skia-flutter-autoroll@skia.org Roll src/third_party/skia f8486f2c5fb6..df432d5efb70 (1 commits) (flutter/engine#12313) 2019-09-17 skia-flutter-autoroll@skia.org Roll src/third_party/skia b47704b0bd34..f8486f2c5fb6 (2 commits) (flutter/engine#12312) 2019-09-16 jason-simmons@users.noreply.github.com Fix the declaration of setSystemGestureExclusionRects to match the PlatformMessageHandler interface (flutter/engine#12306) 2019-09-16 gw280@google.com Manage resource and onscreen contexts using separate IOSGLContext objects (flutter/engine#12277) 2019-09-16 goderbauer@google.com Cleanup in web_ui (flutter/engine#12307) 2019-09-16 30870216+gaaclarke@users.noreply.github.com Made flutter startup faster by allowing initialization to be parallelized (flutter/engine#10182) 2019-09-16 skia-flutter-autoroll@skia.org Roll src/third_party/skia c22498502cda..b47704b0bd34 (16 commits) (flutter/engine#12304) 2019-09-16 jonahwilliams@google.com Include firefox in check to quote font families (flutter/engine#12288) 2019-09-16 bkonyi@google.com Roll src/third_party/dart 7799f424f4..dd1969a43a (2 commits) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-engine-flutter-autoroll Please CC stuartmorgan@google.com on the revert to ensure that a human is aware of the problem. To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+/master/autoroll/README.md
git@github.com:flutter/engine.git/compare/63873d9f421f...d1692d4 git log 63873d9..d1692d4 --no-merges --oneline 2019-09-17 hterkelsen@users.noreply.github.com Update canvaskit backend (flutter/engine#12318) 2019-09-17 mouad.debbar@gmail.com README for the felt tool (flutter/engine#12323) 2019-09-17 jason-simmons@users.noreply.github.com Fix continuous event polling in the GLFW event loop (flutter/engine#12320) 2019-09-17 15365765+rafern@users.noreply.github.com Tests for flutter#11283 (flutter/engine#12322) 2019-09-17 ditman@gmail.com Improve check to render (or not) a DRRect when inner falls outside of outer on RecordingCanvas (flutter/engine#12229) 2019-09-17 bkonyi@google.com Roll src/third_party/dart dd1969a43a..7505b3a5f0 (39 commits) 2019-09-17 30870216+gaaclarke@users.noreply.github.com Channel buffers (flutter/engine#12167) 2019-09-17 xster@google.com Make iOS FlutterViewController stop sending inactive/pause on app lifecycle events when not visible (flutter/engine#12128) 2019-09-17 stuartmorgan@google.com Adds PluginRegistry to the C++ client wrapper API (flutter/engine#12287) 2019-09-17 liyuqian@google.com Add "type" to getDisplayRefreshRate protocol (flutter/engine#12319) 2019-09-17 mouad.debbar@gmail.com Add a build command to felt (flutter/engine#12303) 2019-09-17 skia-flutter-autoroll@skia.org Roll src/third_party/skia df432d5efb70..d545bfbb94ca (1 commits) (flutter/engine#12316) 2019-09-17 skia-flutter-autoroll@skia.org Roll fuchsia/sdk/core/linux-amd64 from rwf0-... to RRgw-... (flutter/engine#12315) 2019-09-17 skia-flutter-autoroll@skia.org Roll src/third_party/skia f8486f2c5fb6..df432d5efb70 (1 commits) (flutter/engine#12313) 2019-09-17 skia-flutter-autoroll@skia.org Roll src/third_party/skia b47704b0bd34..f8486f2c5fb6 (2 commits) (flutter/engine#12312) 2019-09-16 jason-simmons@users.noreply.github.com Fix the declaration of setSystemGestureExclusionRects to match the PlatformMessageHandler interface (flutter/engine#12306) 2019-09-16 gw280@google.com Manage resource and onscreen contexts using separate IOSGLContext objects (flutter/engine#12277) 2019-09-16 goderbauer@google.com Cleanup in web_ui (flutter/engine#12307) 2019-09-16 30870216+gaaclarke@users.noreply.github.com Made flutter startup faster by allowing initialization to be parallelized (flutter/engine#10182) 2019-09-16 skia-flutter-autoroll@skia.org Roll src/third_party/skia c22498502cda..b47704b0bd34 (16 commits) (flutter/engine#12304) 2019-09-16 jonahwilliams@google.com Include firefox in check to quote font families (flutter/engine#12288) 2019-09-16 bkonyi@google.com Roll src/third_party/dart 7799f424f4..dd1969a43a (2 commits) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-engine-flutter-autoroll Please CC stuartmorgan@google.com on the revert to ensure that a human is aware of the problem. To report a problem with the AutoRoller itself, please file a bug: https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug Documentation for the AutoRoller is here: https://skia.googlesource.com/buildbot/+/master/autoroll/README.md
I read through #8489 and tried to get the performance boost in a less invasive way.
We were serializing setup tasks for the shell that shouldn't need to be serialized. This PR lets them fly free as long as possible. It results in a 15% decrease in startup time (~0.05ms).