Skip to content

Commit

Permalink
all: faster midpoint computation in binary search
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
yangwenmai authored and griesemer committed Feb 23, 2021
1 parent f113e9a commit 7af821a
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 6 deletions.
2 changes: 1 addition & 1 deletion src/go/token/position.go
Original file line number Diff line number Diff line change
Expand Up @@ -540,7 +540,7 @@ func searchInts(a []int, x int) int {
// 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
Expand Down
24 changes: 24 additions & 0 deletions src/go/token/position_bench_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// 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)
}
}
2 changes: 1 addition & 1 deletion src/reflect/type.go
Original file line number Diff line number Diff line change
Expand Up @@ -1723,7 +1723,7 @@ func typesByString(s string) []*rtype {
// 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
Expand Down
4 changes: 2 additions & 2 deletions src/strconv/makeisprint.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ var (
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 {
Expand All @@ -52,7 +52,7 @@ func bsearch16(a []uint16, x uint16) int {
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 {
Expand Down
4 changes: 2 additions & 2 deletions src/strconv/quote.go
Original file line number Diff line number Diff line change
Expand Up @@ -440,7 +440,7 @@ func Unquote(s string) (string, error) {
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 {
Expand All @@ -455,7 +455,7 @@ func bsearch16(a []uint16, x uint16) int {
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 {
Expand Down

0 comments on commit 7af821a

Please sign in to comment.