Úkol
V tomto úkolu potřebujete vylepšit existující program tím, že ho zběží rychleji. Zkuste si sami napsat programy, i když se budete muset vrátit a zkontrolovat příklady, které jste použili k praxi. Pak porovnejte vaše řešení s řešením, které máme v další lekci.
Souběžnost v Go je složitý problém, který lépe pochopíte při cvičení. Tato výzva je jen jednou myšlenkou toho, co můžete udělat pro praxi.
Hodně zdaru!
Rychlejší výpočet fibonacciho čísel pomocí souběžnosti
K výpočtu fibonacciho čísel sekvenčním způsobem použijte následující program:
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())
}
Z tohoto existujícího kódu potřebujete vytvořit dva programy:
Vylepšená verze, ve které implementujete souběžnost. Dokončení (maximálně 15 sekund) by mělo trvat několik sekund, stejně jako teď. Měli byste použít kanály ve vyrovnávací paměti.
Napište novou verzi, která vypočítá fibonacciho čísla, dokud uživatel nezadá
quit
do terminálu pomocífmt.Scanf()
funkce. Pokud uživatel stiskne Enter, měli byste vypočítat nové Fibonacci číslo. Jinými slovy, už nebudete mít smyčku od 1 do 10.Použijte dva nepřipojené kanály: jeden k výpočtu fibonacciho čísla a druhého, který čeká na zprávu "ukončit" od uživatele. Tento příkaz budete muset použít
select
.
Tady je příklad interakce s programem:
1
1
2
3
5
8
13
quit
Done calculating Fibonacci!
Done! It took 12.043196415 seconds!