Uitdaging

Voltooid

Voor deze uitdaging moet u een bestaand programma verbeteren door het sneller uit te voeren. Probeer de programma's zelf te schrijven, zelfs als u terug moet gaan en de voorbeelden moet controleren die u hebt gebruikt om te oefenen. Vergelijk vervolgens uw oplossing met de oplossing die we in de volgende les hebben.

Gelijktijdigheid in Go is een complex probleem dat u beter begrijpt wanneer u oefent. Deze uitdaging is slechts één idee van wat u kunt doen om te oefenen.

Succes!

Fibonacci-getallen sneller berekenen met gelijktijdigheid

Gebruik het volgende programma om Fibonacci-getallen op een opeenvolgende manier te berekenen:

package main

import (
    "fmt"
    "math/rand"
    "time"
)

func fib(number float64) float64 {
    x, y := 1.0, 1.0
    for i := 0; i < int(number); i++ {
        x, y = y, x+y
    }

    r := rand.Intn(3)
    time.Sleep(time.Duration(r) * time.Second)

    return x
}

func main() {
    start := time.Now()

    for i := 1; i < 15; i++ {
        n := fib(float64(i))
    fmt.Printf("Fib(%v): %v\n", i, n)
    }

    elapsed := time.Since(start)
    fmt.Printf("Done! It took %v seconds!\n", elapsed.Seconds())
}

U moet twee programma's bouwen met behulp van deze bestaande code:

  • Een verbeterde versie waarin u gelijktijdigheid implementeert. Het duurt een paar seconden om te voltooien (niet meer dan 15 seconden), zoals nu het geval is. U moet gebufferde kanalen gebruiken.

  • Schrijf een nieuwe versie waarmee Fibonacci-nummers worden berekend totdat de gebruiker in de terminal invoert quit met behulp van de fmt.Scanf() functie. Als de gebruiker op Enter drukt, moet u een nieuw Fibonacci-nummer berekenen. Met andere woorden, u hebt geen lus meer van 1 tot 10.

    Gebruik twee niet-gebufferde kanalen: een om het Fibonacci-nummer te berekenen en een andere die wacht op het bericht 'afsluiten' van de gebruiker. U moet de select instructie gebruiken.

Hier volgt een voorbeeld van de interactie met het programma:

1

1

2

3

5

8

13
quit
Done calculating Fibonacci!
Done! It took 12.043196415 seconds!