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は予め待機させておくべきですね。



コメント