Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(292)

Issue 2086123002: MessagePumpDefault can spin for up to 1 ms on Windows (Closed)

Created:
4 years, 6 months ago by stanisc
Modified:
4 years, 6 months ago
Reviewers:
danakj, vmiura, brucedawson
CC:
chromium-reviews, sadrul
Base URL:
https://chromium.googlesource.com/chromium/src.git@master
Target Ref:
refs/pending/heads/master
Project:
chromium
Visibility:
Public.

Description

MessagePumpDefault can spin for up to 1 ms on Windows There are two power efficiency issues that this change is trying to address: 1) On Windows if we call event_.TimedWait(delay) with a sub-ms delay then the wait function will return promptly. This means we end up busy-waiting down to zero. Rounding these times up to 1 ms lets Chrome go idle. ETW profiles show that the spinning makes the message loop inefficient. In some cases up to 50% of all inclusive MessagePumpDefault::Run cycles are spent inside the timed wait. 2) On Windows versions 7 and above wait functions (Sleep, WaitForSingleObject, WaitForMultipleObjects, etc) time out up to 1 ms earlier. That results in iterating through the loop with no new work available (the event isn't set) and too early for delayed tasks to run. This change adds an inner loop around just event_.TimedWait(delay) that makes it go straight to wait for the remaining part of the delay should it wake up too early. This change will trigger a regression in "percentage smooth" metric of smoothness.top_25_smooth benchmark. But giving an increasing focus on power consumption (when running on batteries) it might be worth fixing this now and deal with the smoothness benchmark regression later (see below). "Percentage smooth" uses deltas between Renderer / Browser swap timestamps as an estimation for frame times and counts the percentage of frames under 17 ms. This makes the metric overly sensitive to even slight delays in scheduling of swaps which are mostly avoided in the current implementation due to busy- spinning the loop in the last millisecond of the wait. Swap times can actually move forward & backward inside a frame and still meet V-sync which the existing implementation can't tell without the actual frame statistics. I've filed crbug.com/614154 and crbug.com/614147 to track a more accurate implementation of "Percentage smooth" on Windows. BUG=487724 Committed: https://crrev.com/56ee6be040caa993583170bd5edc472e7b969c9e Cr-Commit-Position: refs/heads/master@{#402027}

Patch Set 1 #

Total comments: 2

Patch Set 2 : Added const to min_delay #

Total comments: 17

Patch Set 3 : Addressed CR feedback #

Total comments: 3

Patch Set 4 : Added a comment #

Unified diffs Side-by-side diffs Delta from patch set Stats (+26 lines, -0 lines) Patch
M base/message_loop/message_pump_default.cc View 1 2 3 2 chunks +26 lines, -0 lines 0 comments Download

Messages

Total messages: 28 (6 generated)
stanisc
PTAL!
4 years, 6 months ago (2016-06-21 21:21:57 UTC) #3
brucedawson
The overhead varies but I'm pretty sure I've seen ETW traces where about half of ...
4 years, 6 months ago (2016-06-21 21:35:11 UTC) #4
stanisc
https://codereview.chromium.org/2086123002/diff/1/base/message_loop/message_pump_default.cc File base/message_loop/message_pump_default.cc (right): https://codereview.chromium.org/2086123002/diff/1/base/message_loop/message_pump_default.cc#newcode62 base/message_loop/message_pump_default.cc:62: TimeDelta min_delay = TimeDelta::FromMilliseconds(1); On 2016/06/21 21:35:11, brucedawson wrote: ...
4 years, 6 months ago (2016-06-22 01:28:07 UTC) #5
danakj
https://codereview.chromium.org/2086123002/diff/20001/base/message_loop/message_pump_default.cc File base/message_loop/message_pump_default.cc (right): https://codereview.chromium.org/2086123002/diff/20001/base/message_loop/message_pump_default.cc#newcode59 base/message_loop/message_pump_default.cc:59: #if defined(OS_WIN) I am wondering about your choice to ...
4 years, 6 months ago (2016-06-22 22:26:55 UTC) #6
vmiura
https://codereview.chromium.org/2086123002/diff/20001/base/message_loop/message_pump_default.cc File base/message_loop/message_pump_default.cc (right): https://codereview.chromium.org/2086123002/diff/20001/base/message_loop/message_pump_default.cc#newcode59 base/message_loop/message_pump_default.cc:59: #if defined(OS_WIN) On 2016/06/22 22:26:55, danakj wrote: > I ...
4 years, 6 months ago (2016-06-22 23:25:28 UTC) #7
stanisc
https://codereview.chromium.org/2086123002/diff/20001/base/message_loop/message_pump_default.cc File base/message_loop/message_pump_default.cc (right): https://codereview.chromium.org/2086123002/diff/20001/base/message_loop/message_pump_default.cc#newcode59 base/message_loop/message_pump_default.cc:59: #if defined(OS_WIN) On 2016/06/22 22:26:55, danakj wrote: > I ...
4 years, 6 months ago (2016-06-22 23:39:44 UTC) #8
brucedawson
https://codereview.chromium.org/2086123002/diff/20001/base/message_loop/message_pump_default.cc File base/message_loop/message_pump_default.cc (right): https://codereview.chromium.org/2086123002/diff/20001/base/message_loop/message_pump_default.cc#newcode59 base/message_loop/message_pump_default.cc:59: #if defined(OS_WIN) That would require evaluating all uses of ...
4 years, 6 months ago (2016-06-22 23:41:51 UTC) #9
danakj
https://codereview.chromium.org/2086123002/diff/20001/base/message_loop/message_pump_default.cc File base/message_loop/message_pump_default.cc (right): https://codereview.chromium.org/2086123002/diff/20001/base/message_loop/message_pump_default.cc#newcode59 base/message_loop/message_pump_default.cc:59: #if defined(OS_WIN) On 2016/06/22 23:41:51, brucedawson wrote: > That ...
4 years, 6 months ago (2016-06-22 23:52:59 UTC) #10
brucedawson
https://codereview.chromium.org/2086123002/diff/20001/base/message_loop/message_pump_default.cc File base/message_loop/message_pump_default.cc (right): https://codereview.chromium.org/2086123002/diff/20001/base/message_loop/message_pump_default.cc#newcode69 base/message_loop/message_pump_default.cc:69: // Windows. It doesn't make sense to run the ...
4 years, 6 months ago (2016-06-23 00:01:12 UTC) #11
danakj
https://codereview.chromium.org/2086123002/diff/20001/base/message_loop/message_pump_default.cc File base/message_loop/message_pump_default.cc (right): https://codereview.chromium.org/2086123002/diff/20001/base/message_loop/message_pump_default.cc#newcode69 base/message_loop/message_pump_default.cc:69: // Windows. It doesn't make sense to run the ...
4 years, 6 months ago (2016-06-23 00:02:55 UTC) #12
stanisc
https://codereview.chromium.org/2086123002/diff/20001/base/message_loop/message_pump_default.cc File base/message_loop/message_pump_default.cc (right): https://codereview.chromium.org/2086123002/diff/20001/base/message_loop/message_pump_default.cc#newcode59 base/message_loop/message_pump_default.cc:59: #if defined(OS_WIN) On 2016/06/22 23:52:59, danakj wrote: > On ...
4 years, 6 months ago (2016-06-23 00:20:33 UTC) #13
stanisc
I've addressed a couple of issues and improved the comment around the |min_delay|. Separately I've ...
4 years, 6 months ago (2016-06-23 21:18:50 UTC) #14
danakj
https://codereview.chromium.org/2086123002/diff/40001/base/message_loop/message_pump_default.cc File base/message_loop/message_pump_default.cc (right): https://codereview.chromium.org/2086123002/diff/40001/base/message_loop/message_pump_default.cc#newcode66 base/message_loop/message_pump_default.cc:66: do { Thanks. One last question I had, that ...
4 years, 6 months ago (2016-06-23 22:08:29 UTC) #15
stanisc
https://codereview.chromium.org/2086123002/diff/40001/base/message_loop/message_pump_default.cc File base/message_loop/message_pump_default.cc (right): https://codereview.chromium.org/2086123002/diff/40001/base/message_loop/message_pump_default.cc#newcode66 base/message_loop/message_pump_default.cc:66: do { On 2016/06/23 22:08:29, danakj wrote: > Thanks. ...
4 years, 6 months ago (2016-06-24 01:32:31 UTC) #16
danakj
https://codereview.chromium.org/2086123002/diff/40001/base/message_loop/message_pump_default.cc File base/message_loop/message_pump_default.cc (right): https://codereview.chromium.org/2086123002/diff/40001/base/message_loop/message_pump_default.cc#newcode66 base/message_loop/message_pump_default.cc:66: do { On 2016/06/24 01:32:30, stanisc wrote: > On ...
4 years, 6 months ago (2016-06-24 19:53:44 UTC) #17
stanisc
On 2016/06/24 19:53:44, danakj wrote: > https://codereview.chromium.org/2086123002/diff/40001/base/message_loop/message_pump_default.cc > File base/message_loop/message_pump_default.cc (right): > > https://codereview.chromium.org/2086123002/diff/40001/base/message_loop/message_pump_default.cc#newcode66 > ...
4 years, 6 months ago (2016-06-24 20:54:54 UTC) #18
danakj
On 2016/06/24 20:54:54, stanisc wrote: > On 2016/06/24 19:53:44, danakj wrote: > > > https://codereview.chromium.org/2086123002/diff/40001/base/message_loop/message_pump_default.cc ...
4 years, 6 months ago (2016-06-24 21:03:47 UTC) #19
stanisc
Thanks! Just to be clear, the approval is for the current implementation, right? I can ...
4 years, 6 months ago (2016-06-24 21:17:32 UTC) #20
danakj
On Fri, Jun 24, 2016 at 2:17 PM, Stanislav Chiknavaryan < stanisc@chromium.org> wrote: > Thanks! ...
4 years, 6 months ago (2016-06-24 21:18:20 UTC) #21
commit-bot: I haz the power
CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/v2/patch-status/codereview.chromium.org/2086123002/60001
4 years, 6 months ago (2016-06-25 00:27:21 UTC) #24
commit-bot: I haz the power
Committed patchset #4 (id:60001)
4 years, 6 months ago (2016-06-25 00:32:33 UTC) #26
commit-bot: I haz the power
4 years, 6 months ago (2016-06-25 00:34:28 UTC) #28
Message was sent while issue was closed.
Patchset 4 (id:??) landed as
https://crrev.com/56ee6be040caa993583170bd5edc472e7b969c9e
Cr-Commit-Position: refs/heads/master@{#402027}

Powered by Google App Engine
This is Rietveld 408576698