Skip to content

Commit

Permalink
runtime: do not call timeBeginPeriod on windows
Browse files Browse the repository at this point in the history
Calling timeBeginPeriod changes Windows global timer resolution
from 15ms to 1ms. This used to improve Go runtime scheduler
performance, but not anymore. Thanks to @aclements, scheduler now
behaves the same way if we call timeBeginPeriod or not.

Remove call to timeBeginPeriod, since it is machine global
resource, and there are downsides of using low timer resolution.
See issue #8687 for details.

Fixes #8687

Change-Id: Ib7e41aa4a81861b62a900e0e62776c9ef19bfb73
Reviewed-on: https://go-review.googlesource.com/17164
Reviewed-by: Austin Clements <austin@google.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Yasuhiro MATSUMOTO <mattn.jp@gmail.com>
Run-TryBot: Alex Brainman <alex.brainman@gmail.com>
  • Loading branch information
alexbrainman committed Nov 24, 2015
1 parent b5fe077 commit ab4c929
Show file tree
Hide file tree
Showing 3 changed files with 2 additions and 18 deletions.
5 changes: 1 addition & 4 deletions src/runtime/export_windows_test.go
Expand Up @@ -8,10 +8,7 @@ package runtime

import "unsafe"

var (
TestingWER = &testingWER
TimeBeginPeriodRetValue = &timeBeginPeriodRetValue
)
var TestingWER = &testingWER

func NumberOfProcessors() int32 {
var info systeminfo
Expand Down
8 changes: 1 addition & 7 deletions src/runtime/os1_windows.go
Expand Up @@ -47,7 +47,6 @@ import (
//go:cgo_import_dynamic runtime._WaitForSingleObject WaitForSingleObject%2 "kernel32.dll"
//go:cgo_import_dynamic runtime._WriteConsoleW WriteConsoleW%5 "kernel32.dll"
//go:cgo_import_dynamic runtime._WriteFile WriteFile%5 "kernel32.dll"
//go:cgo_import_dynamic runtime._timeBeginPeriod timeBeginPeriod%1 "winmm.dll"

var (
// Following syscalls are available on every Windows PC.
Expand Down Expand Up @@ -90,8 +89,7 @@ var (
_WSAGetOverlappedResult,
_WaitForSingleObject,
_WriteConsoleW,
_WriteFile,
_timeBeginPeriod stdFunction
_WriteFile stdFunction

// Following syscalls are only available on some Windows PCs.
// We will load syscalls, if available, before using them.
Expand Down Expand Up @@ -161,8 +159,6 @@ const (
// in sys_windows_386.s and sys_windows_amd64.s
func externalthreadhandler()

var timeBeginPeriodRetValue uint32

func osinit() {
asmstdcallAddr = unsafe.Pointer(funcPC(asmstdcall))

Expand All @@ -178,8 +174,6 @@ func osinit() {

stdcall2(_SetConsoleCtrlHandler, funcPC(ctrlhandler), 1)

timeBeginPeriodRetValue = uint32(stdcall1(_timeBeginPeriod, 1))

ncpu = getproccount()

// Windows dynamic priority boosting assumes that a process has different types
Expand Down
7 changes: 0 additions & 7 deletions src/runtime/syscall_windows_test.go
Expand Up @@ -642,13 +642,6 @@ uintptr_t cfunc(callback f, uintptr_t n) {
}
}

func TestTimeBeginPeriod(t *testing.T) {
const TIMERR_NOERROR = 0
if *runtime.TimeBeginPeriodRetValue != TIMERR_NOERROR {
t.Fatalf("timeBeginPeriod failed: it returned %d", *runtime.TimeBeginPeriodRetValue)
}
}

// removeOneCPU removes one (any) cpu from affinity mask.
// It returns new affinity mask.
func removeOneCPU(mask uintptr) (uintptr, error) {
Expand Down

0 comments on commit ab4c929

Please sign in to comment.