• Frank Somers's avatar
    runtime: use vDSO on linux/386 to improve time.Now performance · af40cbe8
    Frank Somers authored
    This change adds support for accelerating time.Now by using
    the __vdso_clock_gettime fast-path via the vDSO on linux/386
    if it is available.
    
    When the vDSO path to the clocks is available, it is typically
    5x-10x faster than the syscall path (see benchmark extract
    below).  Two such calls are made for each time.Now() call
    on most platforms as of go 1.9.
    
    - Add vdso_linux_386.go, containing the ELF32 definitions
      for use by vdso_linux.go, the maximum array size, and
      the symbols to be located in the vDSO.
    
    - Modify runtime.walltime and runtime.nanotime to check for
      and use the vDSO fast-path if available, or fall back to
      the existing syscall path.
    
    - Reduce the stack reservations for runtime.walltime and
      runtime.monotime from 32 to 16 bytes. It appears the syscall
      path actually only needed 8 bytes, but 16 is now needed to
      cover the syscall and vDSO paths.
    
    - Remove clearing DX from the syscall paths as clock_gettime
      only takes 2 args (BX, CX in syscall calling convention),
      so there should be no need to clear DX.
    
    The included BenchmarkTimeNow was run with -cpu=1 -count=20
    on an "Intel(R) Celeron(R) CPU J1900 @ 1.99GHz", comparing
    released go 1.9.1 vs this change. This shows a gain in
    performance on linux/386 (6.89x), and that no regression
    occurred on linux/amd64 due to this change.
    
    Kernel: linux/i686, GOOS=linux GOARCH=386
       name      old time/op  new time/op  delta
       TimeNow   978ns ± 0%   142ns ± 0%  -85.48%  (p=0.000 n=16+20)
    
    Kernel: linux/x86_64, GOOS=linux GOARCH=amd64
       name      old time/op  new time/op  delta
       TimeNow   125ns ± 0%   125ns ± 0%   ~       (all equal)
    
    Gains are more dramatic in virtualized environments,
    presumably due to the overhead of virtualizing the syscall.
    
    Fixes #22190
    
    Change-Id: I2f83ce60cb1b8b310c9ced0706bb463c1b3aedf8
    Reviewed-on: https://go-review.googlesource.com/69390
    Run-TryBot: Ian Lance Taylor <iant@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarIan Lance Taylor <iant@golang.org>
    af40cbe8
Name
Last commit
Last update
.github Loading commit data...
api Loading commit data...
doc Loading commit data...
lib/time Loading commit data...
misc Loading commit data...
src Loading commit data...
test Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
AUTHORS Loading commit data...
CONTRIBUTING.md Loading commit data...
CONTRIBUTORS Loading commit data...
LICENSE Loading commit data...
PATENTS Loading commit data...
README.md Loading commit data...
favicon.ico Loading commit data...
robots.txt Loading commit data...