ループ処理と並列処理でネットワーク遅延が含まれる処理についてサーバからのレスポンスを待ち受けせずに行った場合(マルチスレッド)とループにより一つずつ処理を実行していった場合で実行時間についてベンチマークを取得しました。
プログラムをいかに掲載します。プログラム説明としましては、ベンチマークに入る前にサーバプログラムはコネクションを確立し、そのコネクションを用いてクエリを飛ばし、レスポンスを取得しています。
リクエストを投げるのをループ的に行った場合が上の場合(つまりクライアント側は次のリクエストを投げる前に直前のリクエストに対するサーバからのレスポンスを逐一待つ)、リクエストを投げるのをマルチスレッドにより並列的に行った場合が下の場合(クライアントはレスポンスを待たず、並列的にリクエストを投げる処理が行われる)
となっています。リクエストはそれぞれ200回投げて実行時間を測定しています。また、サーバまでの往復遅延は30msになるように設定しています。
予想ではマルチスレッドはリクエストを並列に投げて待ち受けできるためはやくなると考えました。しかし、今回の測定ではどちらのベンチマークも実行時間が約6秒になっています。つまり一回のリクエストに30ms(だいたい往復遅延と同じ)ということになりマルチスレッドも結局並列化できていないことになります。
プログラムのどこかにミスがあるのでしょうか?サーバ側の問題なのでしょうか?アドバイスお願いいたします。
ruby
1require 'benchmark' 2require 'thread' 3 4 5def thread_list(threads) 6 num = 0 7 threads.each do |t| 8 p t 9 num += 1 10 end 11end 12 13connection = ##サーバプログラムへのコネクションを接続する処理 14 15 16Benchmark.bm 10 do |r| 17 r.report "Loop" do 18 19LoopNum = 200 20 21for i in 1..LoopNum 22#ネットワークI/Oが絡む処理 23end 24 25 26 end 27 r.report "Thread" do 28 29 30ThreadNum = 200 31 32threads = [] 33count = 0 34 35for i in 1..ThreadNum 36 t = Thread.new do 37 count += 1 38#ネットワークI/Oが絡む処理 39 end 40 threads << t 41end 42 43#puts "main thread" 44 45for i in 1..ThreadNum 46 threads[i - 1].join 47end 48# thread_list(threads) 49 50 end 51end
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/02 17:37