QueueとThreadのベンチマーク比較
2つのケースについて比較検証してみました。
実際に処理する内容は以下のとおり。
- 0~999までの単純足し算を100回する処理を4スレッドで合計10,000回繰り返す
比較するケース
- 4スレッドを毎回作成する
- 予め4スレッドを作成し、Queueで処理を指示する
まぁ、もちろん後者のほうが速いだろうという推測はしているのですが、どれだけ違うのかを調べたい。
ベンチマークコード
import threading import Queue from benchmarker import Benchmarker def thread_target(): x = 0 for i in xrange(1000): x += i def queuing_thread_target(start_queue, finish_queue, stop_event): while True: start_queue.get() if stop_event.is_set(): stop_event.clear() return x = 0 for i in xrange(1000): x += i finish_queue.put(True) def making_thread_100_times(): tarray = [None] * 4 for _ in xrange(25): for i in xrange(4): tarray[i] = threading.Thread(target=thread_target) tarray[i].start() for i in xrange(4): tarray[i].join() def queuing_100times(): tarray = [None] * 4 start_queue = [None] * 4 finish_queue = [None] * 4 stop_event = [None] * 4 for i in xrange(4): start_queue[i] = Queue.Queue() finish_queue[i] = Queue.Queue() stop_event[i] = threading.Event() tarray[i] = threading.Thread(target=queuing_thread_target, args=(start_queue[i], finish_queue[i], stop_event[i])) tarray[i].start() for _ in xrange(25): for i in xrange(4): start_queue[i].put(True) for i in xrange(4): finish_queue[i].get() for i in xrange(4): stop_event[i].set() start_queue[i].put(True) for i in xrange(4): tarray[i].join() if __name__ == "__main__": with Benchmarker(100, width=20) as bench: @bench("makeing_each_thread") def _(bm): for _ in bm: making_thread_100_times() @bench("use_queue") def _(bm): for _ in bm: queuing_100times()
出力結果
## benchmarker: release 4.0.1 (for python) ## python version: 2.7.9 ## python compiler: MSC v.1500 32 bit (Intel) ## python platform: Windows-7-6.1.7601-SP1 ## python executable: C:Python27python.exe ## cpu model: Intel64 Family 6 Model 58 Stepping 9, GenuineIntel ## parameters: loop=100, cycle=1, extra=0 ## real (total = user + sys) makeing_each_thread 2.9530 3.1980 2.2776 0.9204 use_queue 1.8530 1.7784 1.3104 0.4680 ## Ranking real use_queue 1.8530 (100.0) ******************** makeing_each_thread 2.9530 ( 62.7) ************* ## Matrix real [01] [02] [01] use_queue 1.8530 100.0 159.4 [02] makeing_each_thread 2.9530 62.7 100.0
思った通り、Queueつあったほうが断然速いですね。
1.1秒 / 10,000回 のスピードの差が確認できました。思ったよりも大きな差な気がします。やっぱりThreadは予め待機させておくべきですね。
コメント