2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go言語の並行処理より逐次処理のほうが速くなる可能性がある?

Last updated at Posted at 2023-11-07

Go言語を勉強中の方への共有

WEBアプリケーション開発において並行処理よりもCRUD処理をちゃんとできる方が重要と思われる(もしあなたがGoエンジニアを目指して勉強中の場合)。
下記のまとめの部分にも記述してあるが、最近のGoを使用した現場では並行処理で処理を高速化を狙うより、サーバーを冗長化して対応することが一般的。

当方もサーバーサイド実装未経験なため、ご意見や実際の状況等ありましたらご気軽にコメントでご教示よろしくお願い致します。

実装

main.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エンジニアに意見を聞いたものになりますが、
最近ではサーバー自体を冗長化するのが一般的みたいです。並行処理はよほどの大きな効果が見込めない限り、優先的に行わない実装みたいです。

おわり

この記事レポートけ?
もし上記の認識違いなどありましたら、ご気軽に申し付けください。

参考記事

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?