Go言語を勉強中の方への共有
WEBアプリケーション開発において並行処理よりもCRUD処理をちゃんとできる方が重要と思われる(もしあなたがGoエンジニアを目指して勉強中の場合)。
下記のまとめの部分にも記述してあるが、最近のGoを使用した現場では並行処理で処理を高速化を狙うより、サーバーを冗長化して対応することが一般的。
当方もサーバーサイド実装未経験なため、ご意見や実際の状況等ありましたらご気軽にコメントでご教示よろしくお願い致します。
実装
package main
import (
"fmt"
"sync"
"time"
)
func add(start, end int) int {
sum := 0
for i := start; i <= end; i++ {
sum += i
}
return sum
}
func main() {
start := time.Now()
// 逐次処理
sum := add(1, 100)
fmt.Println("Sequential:", sum)
elapsed := time.Since(start)
fmt.Printf("Sequential Time: %d ms\n", elapsed.Microseconds())
start = time.Now()
// 並行処理
var wg sync.WaitGroup
wg.Add(2)
var sum1, sum2 int
go func() {
defer wg.Done()
sum1 = add(1, 50)
}()
go func() {
defer wg.Done()
sum2 = add(51, 100)
}()
wg.Wait()
sum = sum1 + sum2
fmt.Println("Concurrency:", sum)
elapsed = time.Since(start)
fmt.Printf("Concurrency Time: %d ms\n", elapsed.Microseconds())
}
上記ではadd関数を用いて単純な加算処理を行っています。この処理にadd関数の数値を変化させて逐次処理と並行処理の処理時間をマイクロセカンドで出力します。そして、下記にマトリックスにしてまとめてみました。
条件/処理 | 逐次処理(Sequential) ms | 並行処理(Concurrency) ms | 合計数値 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
スタート値 | |||||||||||||
(ゴール値) | 1 | 2 | 3 | 4 | 5 | 中央値 | 1回目 | 2 | 3 | 4 | 5 | 中央値 | - |
1(100) | 26 | 27 | 26 | 26 | 24 | 26 | 37 | 55 | 61 | 46 | 48 | 48 | 5050 |
1(1,000) | 26 | 24 | 26 | 25 | 26 | 26 | 50 | 37 | 46 | 37 | 37 | 37 | 500500 |
1(10,000) | 29 | 31 | 29 | 29 | 31 | 29 | 31 | 48 | 54 | 43 | 48 | 48 | 50005000 |
1(100,000) | 74 | 77 | 75 | 81 | 76 | 76 | 81 | 82 | 75 | 82 | 74 | 82 | 5000050000 |
1(1,000,000) | 535 | 537 | 537 | 581 | 538 | 537 | 314 | 310 | 308 | 321 | 332 | 314 | 500000500000 |
1(10,000,000) | 5617 | 5205 | 5390 | 5154 | 5467 | 5390 | 3210 | 2750 | 3138 | 2738 | 3133 | 3133 | 50000005000000 |
1(100,000,000) | 56669 | 53507 | 55981 | 60820 | 54280 | 55981 | 28327 | 28372 | 28107 | 26124 | 27034 | 28107 | 5000000050000000 |
図1 逐次処理と並行処理を条件下のもとに回数ごとの経過時間と中央値のマトリックス
実施手順
該当箇所の条件値を変更
↓
該当回数実施
↓
値をメモ
結果
加算させるまでの最後の値100,000は並行処理の経過時間中央値が、逐次処理より大きかった。1,000,000以降は並行処理の経過時間は逐次処理より小さくなる結果となった。
考察
- 上記の結果からゴール値1,000,000のそれぞれの処理時間結果は分散が大きさが大きくなる傾向があり、実施回数5回は信頼度が薄いと感じた。
- 並行処理の経過時間が逐次処理の結果より高速になったのは、ゴール値1,000,000の場合出会ったことからこれに相当するデータを扱うときに並行処理を実装時にいい効果が得られそう。
まとめ
- 今回の並行処理の効果が逐次処理より早くなった場面を見られたが、実務中に扱うデータはこのようなデータ量に相当するか、見極めるのは難しい。なので、「逐次処理だと処理が終わるのに数時間かかる」みたいなケースが出てきたときに、並行処理の実装を視野に入れるのではないかと考えられる。
この部分はGoエンジニアに意見を聞いたものになりますが、
最近ではサーバー自体を冗長化するのが一般的みたいです。並行処理はよほどの大きな効果が見込めない限り、優先的に行わない実装みたいです。
おわり
この記事レポートけ?
もし上記の認識違いなどありましたら、ご気軽に申し付けください。
参考記事