PythonのThreadを待機させるか、必要の度に作成するのかのベンチマーク比較

Python
スポンサーリンク

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

コメント

タイトルとURLをコピーしました