(import (time) (sagittarius control)) (define bv (do ((i 0 (+ i 1)) (bv (make-bytevector 100 0))) ((= i 100) bv) (bytevector-u8-set! bv i i))) (define n (bytevector->integer bv)) (define count 100000) (time (dotimes (i count) (integer->bytevector n)))っで、結果:
$ sash test.scm ;; 5.609375 real 5.515000 user 0.016000 sys #| Core Duo 1.66GHz |#もちろん、前回と同じ理由で遅い。ということで、Fixnumの場合とBignumの場合で分ける。
どこまでいってもポイントとしては無駄なアロケーションを避けるという点と、直接Bignumの演算をするのではなく、構成しているlongの値だけで計算するというもの。これで、Cのプリミティブなビット演算だけで片付く。
っで、結果:
$ ./build/sash.exe test.scm ;; 0.156250 real 0.156000 user 0.000000 sys環境はもちろん一緒。50倍くらい速い。とはいっても、この辺りの処理は単発で使われることの方が多いので、ベンチマーク用ともいえる。
CLで、bytevector->integerみたいなのを作ってみたけど、こんなに速くできない。 fixnumの範囲で計算して、後で合体ってのが一番速いだろうか: 時の羅針盤@blog: bytevector->integer 【 compassoftime.blogspot.jp/2012/06/byteve… 】
— ⠗⠐⠥ ⠵⠱⠊⠷さん (@g000001) 6月 14, 2012
これを見て調子の乗ってやった。反省はしていない。
No comments:
Post a Comment