ループ処理内でgoroutineを使わないバージョン
package main
import (
"fmt"
"log"
"time"
)
func main(){
start := time.Now()
var count int
for i := 0; i < 100000; i++ {
func() {
time.Sleep(10 * time.Microsecond)
count++
}()
}
end := time.Now()
log.Printf("Done: %d times\n", count)
log.Println(fmt.Sprintf("The end time %v(s)", end.Sub(start).Seconds()))
}
このコードは、10万回のループ後に、実行結果と経過時間を標準出力に表示するプログラムである。
4秒ほどで完了することができる
go run main.go
2022/09/02 23:18:37 Done: 100000 times
2022/09/02 23:18:37 The end time 4.204919083(s)
goroutineとmutexを使うバージョン
func main() {
start := time.Now()
var count int
// WaitGroupを定義
var wg sync.WaitGroup
// 排他制御
var mu sync.Mutex
for i := 0; i < 100000; i++ {
wg.Add(1)
go func(wg *sync.WaitGroup) {
// 処理完了を通知
defer wg.Done()
// 無名関数が完了したらUnlock
defer mu.Unlock()
time.Sleep(10 * time.Microsecond)
mu.Lock()
count++
}(&wg)
}
// すべてDoneになるまで待機
wg.Wait()
end := time.Now()
log.Printf("Done: %d times\n", count)
log.Println(fmt.Sprintf("The end time %v(s)", end.Sub(start).Seconds()))
}
このコードは、10万回のループ後に、実行結果と経過時間を標準出力に表示するプログラムである。
0.1秒ほどで完了することができる
go run main.go
2022/09/02 23:18:37 Done: 100000 times
2022/09/02 23:18:37 The end time 0.122251961(s)