Macho000

ループ処理内で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)

#Go