| // Copyright 2015 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. | 
 |  | 
 | // +build ignore | 
 |  | 
 | // fastlog2Table contains log2 approximations for 5 binary digits. | 
 | // This is used to implement fastlog2, which is used for heap sampling. | 
 |  | 
 | package main | 
 |  | 
 | import ( | 
 | 	"bytes" | 
 | 	"fmt" | 
 | 	"io/ioutil" | 
 | 	"log" | 
 | 	"math" | 
 | ) | 
 |  | 
 | func main() { | 
 | 	var buf bytes.Buffer | 
 |  | 
 | 	fmt.Fprintln(&buf, "// AUTO-GENERATED by mkfastlog2table.go") | 
 | 	fmt.Fprintln(&buf, "// Run go generate from src/runtime to update.") | 
 | 	fmt.Fprintln(&buf, "// See mkfastlog2table.go for comments.") | 
 | 	fmt.Fprintln(&buf) | 
 | 	fmt.Fprintln(&buf, "package runtime") | 
 | 	fmt.Fprintln(&buf) | 
 | 	fmt.Fprintln(&buf, "const fastlogNumBits =", fastlogNumBits) | 
 | 	fmt.Fprintln(&buf) | 
 |  | 
 | 	fmt.Fprintln(&buf, "var fastlog2Table = [1<<fastlogNumBits + 1]float64{") | 
 | 	table := computeTable() | 
 | 	for _, t := range table { | 
 | 		fmt.Fprintf(&buf, "\t%v,\n", t) | 
 | 	} | 
 | 	fmt.Fprintln(&buf, "}") | 
 |  | 
 | 	if err := ioutil.WriteFile("fastlog2table.go", buf.Bytes(), 0644); err != nil { | 
 | 		log.Fatalln(err) | 
 | 	} | 
 | } | 
 |  | 
 | const fastlogNumBits = 5 | 
 |  | 
 | func computeTable() []float64 { | 
 | 	fastlog2Table := make([]float64, 1<<fastlogNumBits+1) | 
 | 	for i := 0; i <= (1 << fastlogNumBits); i++ { | 
 | 		fastlog2Table[i] = math.Log2(1.0 + float64(i)/(1<<fastlogNumBits)) | 
 | 	} | 
 | 	return fastlog2Table | 
 | } |