On my machine (3.1 GHz Quad-Core Intel Core i7, macOS 10.15.7 10.15.7), go 1.15.6
benchstat:
name old time/op new time/op delta
SearchInts-8 20.3ns ± 1% 16.6ns ± 6% -18.37% (p=0.000 n=9+10)
Change-Id: I346e5955fd6df6ce10254b22267dbc8d5a2b16c0
Reviewed-on: https://go-review.googlesource.com/c/go/+/279439
Reviewed-by: Ben Shi <powerman1st@163.com>
Reviewed-by: Robert Griesemer <gri@golang.org>
Trust: Robert Griesemer <gri@golang.org>
// TODO(gri): Remove this when compilers have caught up.
i, j := 0, len(a)
for i < j {
- h := i + (j-i)/2 // avoid overflow when computing h
+ h := i + (j-i)>>1 // avoid overflow when computing h
// i ≤ h < j
if a[h] <= x {
i = h + 1
--- /dev/null
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package token
+
+import (
+ "testing"
+)
+
+func BenchmarkSearchInts(b *testing.B) {
+ data := make([]int, 10000)
+ for i := 0; i < 10000; i++ {
+ data[i] = i
+ }
+ const x = 8
+ if r := searchInts(data, x); r != x {
+ b.Errorf("got index = %d; want %d", r, x)
+ }
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ searchInts(data, x)
+ }
+}
// This is a copy of sort.Search, with f(h) replaced by (*typ[h].String() >= s).
i, j := 0, len(offs)
for i < j {
- h := i + (j-i)/2 // avoid overflow when computing h
+ h := i + (j-i)>>1 // avoid overflow when computing h
// i ≤ h < j
if !(rtypeOff(section, offs[h]).String() >= s) {
i = h + 1 // preserves f(i-1) == false
func bsearch16(a []uint16, x uint16) int {
i, j := 0, len(a)
for i < j {
- h := i + (j-i)/2
+ h := i + (j-i)>>1
if a[h] < x {
i = h + 1
} else {
func bsearch32(a []uint32, x uint32) int {
i, j := 0, len(a)
for i < j {
- h := i + (j-i)/2
+ h := i + (j-i)>>1
if a[h] < x {
i = h + 1
} else {
func bsearch16(a []uint16, x uint16) int {
i, j := 0, len(a)
for i < j {
- h := i + (j-i)/2
+ h := i + (j-i)>>1
if a[h] < x {
i = h + 1
} else {
func bsearch32(a []uint32, x uint32) int {
i, j := 0, len(a)
for i < j {
- h := i + (j-i)/2
+ h := i + (j-i)>>1
if a[h] < x {
i = h + 1
} else {