Skip to content

Commit ff51353

Browse files
committed
runtime: move nanotime wrappers to time and poll packages
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 <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]>
1 parent fc3f8d4 commit ff51353

File tree

3 files changed

+7
-13
lines changed

3 files changed

+7
-13
lines changed

src/internal/poll/fd_poll_runtime.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ import (
1111
"sync"
1212
"syscall"
1313
"time"
14+
_ "unsafe" // for go:linkname
1415
)
1516

1617
// runtimeNano returns the current value of the runtime clock in nanoseconds.
18+
//go:linkname runtimeNano runtime.nanotime
1719
func runtimeNano() int64
1820

1921
func runtime_pollServerInit()

src/runtime/time.go

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -458,15 +458,3 @@ func siftdownTimer(t []*timer, i int) bool {
458458
func badTimer() {
459459
panic(errorString("racy use of timers"))
460460
}
461-
462-
// Entry points for net, time to call nanotime.
463-
464-
//go:linkname poll_runtimeNano internal/poll.runtimeNano
465-
func poll_runtimeNano() int64 {
466-
return nanotime()
467-
}
468-
469-
//go:linkname time_runtimeNano time.runtimeNano
470-
func time_runtimeNano() int64 {
471-
return nanotime()
472-
}

src/time/time.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,10 @@
7575
//
7676
package time
7777

78-
import "errors"
78+
import (
79+
"errors"
80+
_ "unsafe" // for go:linkname
81+
)
7982

8083
// A Time represents an instant in time with nanosecond precision.
8184
//
@@ -1065,6 +1068,7 @@ func daysIn(m Month, year int) int {
10651068
func now() (sec int64, nsec int32, mono int64)
10661069

10671070
// runtimeNano returns the current value of the runtime clock in nanoseconds.
1071+
//go:linkname runtimeNano runtime.nanotime
10681072
func runtimeNano() int64
10691073

10701074
// Monotonic times are reported as offsets from startNano.

0 commit comments

Comments
 (0)