Goで並行処理のベンチマークとってみた

人生初めての経験をたくさんしたのでshareします。

その経験というのがベンチマークを取ることです。

最近Goの勉強をしていてgoroutineのところで、

並行処理って実際どのくらいすごいの?

と疑問を思ったのでベンチマークとってみました。

http://qiita.com/syossan27/items/148e33dd9da4ee3dc89b

(参考にしましたありがとうございます。)

package main

import (
	//"fmt"
	"testing"
)

const MAX = 100000

func BenchmarkNotPararell(b *testing.B) {
	i := 1
	b.ResetTimer()
	for i <= MAX {
		if sosu(i) != 0 {
			//fmt.Println(i)
		}
		i++
	}
}

func BenchmarkPararell(b *testing.B) {
	j := 1
	ch := make(chan int)
	b.ResetTimer()

	for j <= MAX {
		go sosuChanel(j, ch)
		j++
	}

	k := 1
	for k <= MAX {
		result := <-ch
		if result != 0 {
			//fmt.Println(result)
		}
		k++
	}
}

func sosu(num int) int {
	n := 2
	for n <= num/2 {
		if num%n == 0 {
			return 0
		}
		n++
	}
	return num
}

func sosuChanel(num int, ch chan int) {
	n := 2
	for n <= num/2 {
		if num%n == 0 {
			ch <- 0
			return
		}
		n++
	}
	ch <- num
}

goroutineの使い方がこれがいいのかわかりませんが

とりあえずベンチマークはできました。

goのベンチマークの取り方は *_test.goというファイル名で

go test -bench Pararell (Pararellと名前のつくものだけテスト)です。

結果は?

 BenchmarkNotPararell-8 1	2319052199 ns/op

 BenchmarkPararell-8 2000000000	0.25 ns/op


真ん中の数値はテストの回数でしょうか?

とりあえず一番右の (ns/op)は速度みたいです。

並行処理ってだいぶ早いですね。

順番がどうでもいい処理は並行処理を使いこなせたらいいなと思いました。