From ab4c9298b8185a056ff1152f2c7bd9b38d3d06f3 Mon Sep 17 00:00:00 2001 From: Alex Brainman Date: Mon, 23 Nov 2015 15:26:00 +1100 Subject: [PATCH] runtime: do not call timeBeginPeriod on windows 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 Reviewed-by: Brad Fitzpatrick Reviewed-by: Yasuhiro MATSUMOTO Run-TryBot: Alex Brainman --- src/runtime/export_windows_test.go | 5 +---- src/runtime/os1_windows.go | 8 +------- src/runtime/syscall_windows_test.go | 7 ------- 3 files changed, 2 insertions(+), 18 deletions(-) diff --git a/src/runtime/export_windows_test.go b/src/runtime/export_windows_test.go index 703b422ac23..f712c6f6535 100644 --- a/src/runtime/export_windows_test.go +++ b/src/runtime/export_windows_test.go @@ -8,10 +8,7 @@ package runtime import "unsafe" -var ( - TestingWER = &testingWER - TimeBeginPeriodRetValue = &timeBeginPeriodRetValue -) +var TestingWER = &testingWER func NumberOfProcessors() int32 { var info systeminfo diff --git a/src/runtime/os1_windows.go b/src/runtime/os1_windows.go index 551705797d9..90e03674a40 100644 --- a/src/runtime/os1_windows.go +++ b/src/runtime/os1_windows.go @@ -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. @@ -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. @@ -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)) @@ -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 diff --git a/src/runtime/syscall_windows_test.go b/src/runtime/syscall_windows_test.go index 8b9945b22dd..30630bc904f 100644 --- a/src/runtime/syscall_windows_test.go +++ b/src/runtime/syscall_windows_test.go @@ -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) {