スレッドの生成で最も重いのはVMスタックを割り当てる部分だと大まかにあたりをつけてはいた。ついでに、VMスタックをCスタック上におければよくね?とも考えてはいた。ずっと思っていただけで実行には移さなかったのだが、ここに来てちと重要になりそうなのでえいや!っと試してみることにした。
スレッド=VMということはスレッドの寿命=VMの寿命でもあるので、開始時にスレッドのスタックからVMスタックを割り付ければ問題ないはず。ということでそんな感じのコードを書いて適当なベンチマークを行ってみた。以下はベンチマークのコード
(import (rnrs) (srfi :1) (srfi :18) (time)) (define data (iota 10000)) (let ((threads (time (map (lambda (i) (thread-start! (make-thread (lambda () i)))) data)))) (assert (equal? data (map thread-join! threads))))スレッドの生成時間のみを測りたいので、こんなに単純。っで以下が結果(環境 Ubuntu 16.04 64bit Intel® Core™ i7-6820HQ CPU @ 2.70GHz × 8):
元のコード
$ sash thread-bench.scm ;; (map (lambda (i) (thread-start! (make-thread (lambda () i)))) data) ;; 2.626753 real 3.012000 user 0.256000 sys改良版
$ ./build/sagittarius -Dbuild thread-bench.scm ;; (map (lambda (i) (thread-start! (make-thread (lambda () i)))) data) ;; 0.239091 real 0.120000 user 0.224000 sysちょっと出来過ぎな感じもするが、効果はありっぽい。まぁ、生成数をひとけた減らすと3倍程度の改善になるので、メモリの圧迫が減っただけとも言える(それが目的なのではあるが)。
No comments:
Post a Comment