Hello,
I m trying to use the go tool trace. My code is 

package main

import (
"flag"
"fmt"
"math"
"net/http"
"os"
"runtime"
"runtime/trace"
"time"
)

func indexHandler(w http.ResponseWriter, r *http.Request) {
primesInRangeParallel(10, 64)
fmt.Fprintf(w, "hello world, I'm running on %s with an %s CPU ", 
runtime.GOOS, runtime.GOARCH)

}

func main() {
flag.Parse()
f, errs := os.Create(time.Now().Format("2006-01-02T150405.out"))
if errs != nil {
panic(errs)
}

if err := trace.Start(f); err != nil {
panic(err)
}

defer f.Close()
defer trace.Stop()
http.HandleFunc("/", indexHandler)

http.ListenAndServe(":8080", nil)
}

// We will use this struct to communicate results via a channel
type PrimeResult struct {
number int64 // A number
prime  bool  // Is prime or not
}

/**
 * A function to return a prime calculation over a channel. This way
 * we don't need to have 2 versions of isPrime function, one for
 * sequential calculations and another for paralel
 */

func isPrimeAsync(number int64, channel chan PrimeResult) {

result := new(PrimeResult)
result.number = number
result.prime = isPrime(number)
channel <- *result
}

/**
 * Accepts a range of integers [min, max] and a channel and it executes
 * in PARALEL the processes that check if a number is prime or not.
 *
 * This function does nothing with the result. In another point, somebody
 * will have to read the channel and process the results
 */
func firePrimeCalculations(min int64, max int64, channel chan PrimeResult) {
var i int64
for i = min; i <= max; i++ {
go isPrimeAsync(i, channel)
}
}

/**
 * Accepts a range of integers [min, max] and
 * returns an array with all the prime numbers in this range.
 *
 * Execution is done in paralel. First it fires all the
 * processes that check for a prime number. These processes
 * will write the result in a channel.
 *
 * We will receive the results over this channel creating the
 * list of prime numbers and returning it
 *
 */

func primesInRangeParallel(min int64, max int64) []int64 {
var primeNumbers []int64
var res PrimeResult
var prev int64

channel := make(chan PrimeResult)
defer close(channel)

go firePrimeCalculations(min, max, channel)

prev = 0
for i := min; i <= max; i++ {
res = <-channel
if res.prime {
primeNumbers = append(primeNumbers, res.number)

done := 100 * (i - min) / (max - min)
if prev != done {
fmt.Printf("%d %% done.\n", done)
prev = done
}
}
}
return primeNumbers
}
func isPrime(candidate int64) bool {
var i, limit int64

if candidate == 2 {
return true
}

if math.Mod(float64(candidate), 2) == 0 {
return false
}

limit = int64(math.Ceil(math.Sqrt(float64(candidate))))
for i = 3; i <= limit; i += 2 { //Only odd numbers
if math.Mod(float64(candidate), float64(i)) == 0 {
return false
}
}
return true
}

The prime number calculation is basically there to get some calculation.

My go env command gives  : 

C:\repo\gonew\src\github.com\tixu\trace>go env
set GOARCH=amd64
set GOBIN=
set GOEXE=.exe
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=c:\repo\gonew
set GORACE=
set GOROOT=C:\Go
set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64
set CC=gcc
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0
set CXX=g++
set CGO_ENABLED=1



And I get the following error :

C:\repo\gonew\src\github.com\tixu\trace>go tool trace Trace 
2016-10-11T153554.out
2016/10/11 15:36:45 Parsing trace...
failed to parse trace: no EvFrequency event 

Can you help me .?

Thanks in advance,

Xavier

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to