Goの並行処理は、関数の前にGoを入れるだけで処理対象になります。リソースの排他処理が必要なときには他の言語と同様なmutexを使う、あるいはチャネルを使っても良さそうです。
<素数を求めるコード>
package main
import (
"sync"
"time"
"fmt"
)
func main() {
var wg sync.WaitGroup
var mu sync.Mutex
c := 2
odd := []int{}
tStart := time.Now()
for i := 2; i <= 10000*1000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
flag := true // if odd number, stay "true"
mu.Lock()
defer mu.Unlock()
for j :=2; j*j <= c ; j++ {
if c%j == 0{
flag = false
break
}
}
if flag == true{
odd = append(odd, c)
}
c++
}()
}
wg.Wait()
tStop := time.Now()
fmt.Println(len(odd))
el := tStop.Sub(tStart)
fmt.Println(el)
}
mutexを宣言する場所はこのケースではc++の直前でも良さそうなのですが、この位置じゃないとちゃんと結果が出ません。(TBD)
ちなみにC++との実行速度の比較、
千万までの素数計算をM1 Macでさせると、
C++ : およそ1.5秒、Go : およそ6秒と四倍程度遅い。スクリプト言語とは比べようもなく速いのですが。
しかしGoで並行処理をやめて(関数の先頭にgoを付けない)シングルスレッドにすると1.3秒程度で処理完了するから、並行処理にするとオーバーヘッドの分遅くなるだけです。実はGoはシングルスレッド(ネーティブで)でもマルチコアで並列処理を実行するようですね。
—————————————————
さらに以下のコードをM1 MacとRaspberry PI B+(700MHz single core)で実行速度を比較(実行速度向上の点からはほぼ無意味な並行処理)すると、
おおよそラズパイは1/150の実行速度、
admin