ページ

2008年10月8日

スレッドとプロセスのできるまでの時間を比べる

昨日のエントリで,multiprocessingの方がthreadよりパフォーマンスがよいと言うお話でした。ただし,昔ながらの言い伝えによると,プロセスの生成はスレッドより遥かにコストがかかる処理です。どれくらいのコスト差があるのか,比較してましょう。テストに使ったスクリプトは次のものです。

import time, sys
import thread
from multiprocessing import Process

def doIt(start):
end = time.time()
print end - start

if __name__ == "__main__":
if len(sys.argv) > 1 and sys.argv[1] == "thread":
thread.start_new_thread(doIt, (time.time(),))
time.sleep(1)
else:
Process(target=doIt, args=(time.time(),)).start()

doIt関数が実行され始めるまでの時間です。これは実際にはプロセスやスレッドの作成のための正確な時間がでるわけではないですが,大体の目安にはなります。次のテーブルはスレッドによるものとmultiprocessingのものの時間(秒)です。
スレッドmultiprocessing
0.00019693374630.0215649604797
0.00020098686210.0210480690002
0.00069308280940.0213701725006
0.00007104873650.0214710235596
0.00031495094290.0205829143524

で,プロセスの生成はスレッドの生成に比べて100倍近く遅いです。昨日の計測では,重い処理をやっていたのでプロセスやスレッドの生成は誤差の範囲内ですが,処理自体が0.02秒以内でおわるようなものだと,いろいろとトレードオフが発生しそうです。もっともプロセスプーリングすればその辺は解消されるので,一概にだめとは言い切れませんが。

2 件のコメント:

匿名 さんのコメント...

OSXのプロセス生成のオーバーヘッドが大きい為ですね。
手持ちのLinux(Ubuntu 8.04)では12倍程度の差です。

liris さんのコメント...

プロセス生成のオーバーヘッドが,OS Xが有意に大きいだけなのか・・・。

Linuxでも約一桁違うのは,それはそれで大きいですね。。