mirror of
https://github.com/golang/go
synced 2024-11-24 19:20:03 -07:00
53fd522c0d
Follows suit with https://go-review.googlesource.com/#/c/20111. Generated by running $ grep -R 'Go Authors. All' * | cut -d":" -f1 | while read F;do perl -pi -e 's/Go Authors. All/Go Authors. All/g' $F;done The code in cmd/internal/unvendor wasn't changed. Fixes #15213 Change-Id: I4f235cee0a62ec435f9e8540a1ec08ae03b1a75f Reviewed-on: https://go-review.googlesource.com/21819 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
85 lines
1.5 KiB
Go
85 lines
1.5 KiB
Go
// Copyright 2011 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.
|
|
|
|
// This benchmark, taken from the shootout, tests array indexing
|
|
// and array bounds elimination performance.
|
|
|
|
package go1
|
|
|
|
import "testing"
|
|
|
|
func fannkuch(n int) int {
|
|
if n < 1 {
|
|
return 0
|
|
}
|
|
|
|
n1 := n - 1
|
|
perm := make([]int, n)
|
|
perm1 := make([]int, n)
|
|
count := make([]int, n)
|
|
|
|
for i := 0; i < n; i++ {
|
|
perm1[i] = i // initial (trivial) permutation
|
|
}
|
|
|
|
r := n
|
|
didpr := 0
|
|
flipsMax := 0
|
|
for {
|
|
if didpr < 30 {
|
|
didpr++
|
|
}
|
|
for ; r != 1; r-- {
|
|
count[r-1] = r
|
|
}
|
|
|
|
if perm1[0] != 0 && perm1[n1] != n1 {
|
|
flips := 0
|
|
for i := 1; i < n; i++ { // perm = perm1
|
|
perm[i] = perm1[i]
|
|
}
|
|
k := perm1[0] // cache perm[0] in k
|
|
for { // k!=0 ==> k>0
|
|
for i, j := 1, k-1; i < j; i, j = i+1, j-1 {
|
|
perm[i], perm[j] = perm[j], perm[i]
|
|
}
|
|
flips++
|
|
// Now exchange k (caching perm[0]) and perm[k]... with care!
|
|
j := perm[k]
|
|
perm[k] = k
|
|
k = j
|
|
if k == 0 {
|
|
break
|
|
}
|
|
}
|
|
if flipsMax < flips {
|
|
flipsMax = flips
|
|
}
|
|
}
|
|
|
|
for ; r < n; r++ {
|
|
// rotate down perm[0..r] by one
|
|
perm0 := perm1[0]
|
|
for i := 0; i < r; i++ {
|
|
perm1[i] = perm1[i+1]
|
|
}
|
|
perm1[r] = perm0
|
|
count[r]--
|
|
if count[r] > 0 {
|
|
break
|
|
}
|
|
}
|
|
if r == n {
|
|
return flipsMax
|
|
}
|
|
}
|
|
return 0
|
|
}
|
|
|
|
func BenchmarkFannkuch11(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
fannkuch(11)
|
|
}
|
|
}
|