Home | History | Annotate | Download | only in runtime
      1 // Copyright 2015 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 // +build ignore
      6 
      7 // fastlog2Table contains log2 approximations for 5 binary digits.
      8 // This is used to implement fastlog2, which is used for heap sampling.
      9 
     10 package main
     11 
     12 import (
     13 	"bytes"
     14 	"fmt"
     15 	"io/ioutil"
     16 	"log"
     17 	"math"
     18 )
     19 
     20 func main() {
     21 	var buf bytes.Buffer
     22 
     23 	fmt.Fprintln(&buf, "// AUTO-GENERATED by mkfastlog2table.go")
     24 	fmt.Fprintln(&buf, "// Run go generate from src/runtime to update.")
     25 	fmt.Fprintln(&buf, "// See mkfastlog2table.go for comments.")
     26 	fmt.Fprintln(&buf)
     27 	fmt.Fprintln(&buf, "package runtime")
     28 	fmt.Fprintln(&buf)
     29 	fmt.Fprintln(&buf, "const fastlogNumBits =", fastlogNumBits)
     30 	fmt.Fprintln(&buf)
     31 
     32 	fmt.Fprintln(&buf, "var fastlog2Table = [1<<fastlogNumBits + 1]float64{")
     33 	table := computeTable()
     34 	for _, t := range table {
     35 		fmt.Fprintf(&buf, "\t%v,\n", t)
     36 	}
     37 	fmt.Fprintln(&buf, "}")
     38 
     39 	if err := ioutil.WriteFile("fastlog2table.go", buf.Bytes(), 0644); err != nil {
     40 		log.Fatalln(err)
     41 	}
     42 }
     43 
     44 const fastlogNumBits = 5
     45 
     46 func computeTable() []float64 {
     47 	fastlog2Table := make([]float64, 1<<fastlogNumBits+1)
     48 	for i := 0; i <= (1 << fastlogNumBits); i++ {
     49 		fastlog2Table[i] = math.Log2(1.0 + float64(i)/(1<<fastlogNumBits))
     50 	}
     51 	return fastlog2Table
     52 }
     53