/* Landesamt für Geoinformation und Landentwicklung, Referat 35 Einführung in die Sprache Go, 25.7.2017 Lektion 10: Unittests, Benchmarks und Profiling */ package main import ( "fmt" "math" "runtime" "strconv" "sync" "time" ) var ( maxThreads, maxRoutines int8 gesuchteZahl int = 8978793242417717171 //5769977777 timestamp [2]int64 ) const ThreadFaktor int8 = 4 //! var wg sync.WaitGroup func is_prime(n *int) bool { if *n == 2 { // 2 ist die einzige gerade Primzahl return true } else if *n < 2 || *n&1 == 0 { // falls zahl < 2 oder gerade Zahl -> keine Primzahl (1 keine Primzahl) return false } else { var reportChannel chan int = make(chan int, maxRoutines) var stopChannel chan bool = make(chan bool, maxRoutines-1) maxSchleife := int(math.Sqrt(float64(*n))) for start := int8(3); start <= 3+(maxRoutines-1)*2; start += 2 { wg.Add(1) go func(s int8, e, g *int, mf *int8, cr chan int, cs chan bool) { defer wg.Done() select { case <-cs: // Heh, Ihr könnt aufhören return default: for i := int(s); i <= *e; i += int(*mf) * 2 { //fmt.Println(i) if *g%i == 0 { select { case cr <- i: default: fmt.Println("Channel voll!") } return } } } cr <- -1 }(start, &maxSchleife, n, &maxRoutines, reportChannel, stopChannel) } for j := int8(0); j < maxRoutines; j++ { select { case cvalue, cstatus := <-reportChannel: if cstatus && cvalue > 0 { fmt.Println("Teiler gefunden", cvalue) for i := int8(1); i < maxRoutines; i++ { // 1 to < maxThreads ist effizienter als 0 to < maxThreads-1 stopChannel <- true } wg.Wait() close(reportChannel) close(stopChannel) return false } } } return true } } func main() { maxThreads = int8(runtime.NumCPU()) //! maxRoutines = maxThreads * ThreadFaktor runtime.GOMAXPROCS(int(maxThreads)) timestamp[0] = time.Now().UnixNano() if is_prime(&gesuchteZahl) == true { fmt.Println(strconv.Itoa(gesuchteZahl) + " IST eine Primzahl") } else { fmt.Println(strconv.Itoa(gesuchteZahl) + " ist KEINE Primzahl") } timestamp[1] = time.Now().UnixNano() fmt.Printf("\nProzess ist fertig und hat mit %v Routinen, verteilt auf %v Threads, %v Sekunden gedauert!\n\n", maxRoutines, maxThreads, (float64(timestamp[1]-timestamp[0]) * math.Pow(10, -9))) }