]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: move nanotime wrappers to time and poll packages
authorDmitry Vyukov <dvyukov@google.com>
Wed, 31 Oct 2018 16:42:15 +0000 (17:42 +0100)
committerDmitry Vyukov <dvyukov@google.com>
Fri, 2 Nov 2018 12:52:30 +0000 (12:52 +0000)
The nanotime wrappers in runtime introduce a bunch
of unnecessary code onto hot paths, e.g.:

0000000000449d70 <time.runtimeNano>:
  449d70:       64 48 8b 0c 25 f8 ff    mov    %fs:0xfffffffffffffff8,%rcx
  449d77:       ff ff
  449d79:       48 3b 61 10             cmp    0x10(%rcx),%rsp
  449d7d:       76 26                   jbe    449da5 <time.runtimeNano+0x35>
  449d7f:       48 83 ec 10             sub    $0x10,%rsp
  449d83:       48 89 6c 24 08          mov    %rbp,0x8(%rsp)
  449d88:       48 8d 6c 24 08          lea    0x8(%rsp),%rbp
  449d8d:       e8 ae 18 01 00          callq  45b640 <runtime.nanotime>
  449d92:       48 8b 04 24             mov    (%rsp),%rax
  449d96:       48 89 44 24 18          mov    %rax,0x18(%rsp)
  449d9b:       48 8b 6c 24 08          mov    0x8(%rsp),%rbp
  449da0:       48 83 c4 10             add    $0x10,%rsp
  449da4:       c3                      retq
  449da5:       e8 56 e0 00 00          callq  457e00 <runtime.morestack_noctxt>
  449daa:       eb c4                   jmp    449d70 <time.runtimeNano>

Move them to the corresponding packages which eliminates all of this.

name                  old time/op  new time/op  delta
TCP4OneShotTimeout-6  17.1µs ± 1%  17.0µs ± 0%  -0.66%  (p=0.032 n=5+5)
SetReadDeadline-6      234ns ± 1%   232ns ± 0%  -0.77%  (p=0.016 n=5+4)

Update #25729

Change-Id: Iee05027adcdc289ba895c5f5a37f154e451bc862
Reviewed-on: https://go-review.googlesource.com/c/146342
Run-TryBot: Dmitry Vyukov <dvyukov@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/internal/poll/fd_poll_runtime.go
src/runtime/time.go
src/time/time.go

index b91cbe40e487e991e05846b4f0b31d4606e3f95c..a48e62eefa44370a6861fc6a752822fdb6ce4ca9 100644 (file)
@@ -11,9 +11,11 @@ import (
        "sync"
        "syscall"
        "time"
+       _ "unsafe" // for go:linkname
 )
 
 // runtimeNano returns the current value of the runtime clock in nanoseconds.
+//go:linkname runtimeNano runtime.nanotime
 func runtimeNano() int64
 
 func runtime_pollServerInit()
index b345ed4e02390fa159d7cb1ee44aa31fa6bef257..28a4722866498db4cf70a512cdd78f6a879bb831 100644 (file)
@@ -458,15 +458,3 @@ func siftdownTimer(t []*timer, i int) bool {
 func badTimer() {
        panic(errorString("racy use of timers"))
 }
-
-// Entry points for net, time to call nanotime.
-
-//go:linkname poll_runtimeNano internal/poll.runtimeNano
-func poll_runtimeNano() int64 {
-       return nanotime()
-}
-
-//go:linkname time_runtimeNano time.runtimeNano
-func time_runtimeNano() int64 {
-       return nanotime()
-}
index 4241a6241bf52c136f087da4fb5dac2081bb6055..5dc0d8a973da3256327a68a56bc05efdc5a79dff 100644 (file)
 //
 package time
 
-import "errors"
+import (
+       "errors"
+       _ "unsafe" // for go:linkname
+)
 
 // A Time represents an instant in time with nanosecond precision.
 //
@@ -1065,6 +1068,7 @@ func daysIn(m Month, year int) int {
 func now() (sec int64, nsec int32, mono int64)
 
 // runtimeNano returns the current value of the runtime clock in nanoseconds.
+//go:linkname runtimeNano runtime.nanotime
 func runtimeNano() int64
 
 // Monotonic times are reported as offsets from startNano.