#:g1: cl-performance-tuning-helperの紹介

Posted 2014-11-01 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の306日目です。

cl-performance-tuning-helperとはなにか

 cl-performance-tuning-helperは、Shingo SUZUKI氏作のパフォーマンス測定用のユーティリティです。

パッケージ情報

パッケージ名cl-performance-tuning-helper
Quicklisp
Quickdocscl-performance-tuning-helper | Quickdocs
CL Test Grid: ビルド状況cl-performance-tuning-helper | CL Test Grid

インストール方法

(ql:quickload :cl-performance-tuning-helper)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 定義されているのは、

の4つです。

 cloadは、compile-file & loadのイディオムを一つにまとめたもの。
asmoutは、disassembleの結果をファイルに書き出します。
performanceは、繰り返し回数を指定しつつ全体にtimeを実行します。

(pth:performance 100 nil (fib 20))
;>> ;;; performance test for FIB 100 times
;>> ;;;   do (FIB 20)
;>> Evaluation took:
;>>   0.013 seconds of real time
;>>   0.012000 seconds of total run time (0.012000 user, 0.000000 system)
;>>   92.31% CPU
;>>   41,794,209 processor cycles
;>>   0 bytes consed
;=> T  

trash-outputsは、いらない出力を捨てるというもの。UNIXでいえば、> /dev/nullという感じです。

 ちなみに現在の実装だと文字列ストリームに出力するようになっていますが、出力を捨てるためのストリームはmake-broadcast-streamで作れるので、こっちを利用した方が効率が良いかなと思ったりしました。

(defmacro trash-outputs (&body body)
  "trash system stream outputs:
*standard-output*,
*error-output*,
and *trace-output*."
  (let ((sos (gensym)))
    `(let* ((,sos (make-string-output-stream))
            (*standard-output* ,sos)
            (*error-output* ,sos)
            (*trace-output* ,sos) )
       ,@body )))

(defmacro trash-outputs/broadcast-stream (&body body) (let ((out (gensym))) `(let* ((,out (make-broadcast-stream)) (*standard-output* ,out) (*error-output* ,out) (*trace-output* ,out)) ,@body)))

 計測するとこんな感じです。

(defvar *s1000* (make-string 1000))

(pth:trash-outputs (dotimes (i (* 1000 1000)) (princ *s1000*))) ;=> NIL #|------------------------------------------------------------| Evaluation took: 1.266 seconds of real time 1.268000 seconds of total run time (0.608000 user, 0.660000 system) [ Run times consist of 0.012 seconds GC time, and 1.256 seconds non-GC time. ] 100.16% CPU 4,167,340,275 processor cycles 4,194,413,440 bytes consed

Intel(R) Xeon(R) CPU E3-1230 v3 @ 3.30GHz |------------------------------------------------------------|#

(trash-outputs/broadcast-stream (dotimes (i (* 1000 1000)) (princ *s1000*))) ;=> NIL #|------------------------------------------------------------| Evaluation took: 0.090 seconds of real time 0.092000 seconds of total run time (0.092000 user, 0.000000 system) 102.22% CPU 297,093,468 processor cycles 0 bytes consed

Intel(R) Xeon(R) CPU E3-1230 v3 @ 3.30GHz |------------------------------------------------------------|#

まとめ

 今回は、cl-performance-tuning-helperを紹介してみました。
チューニングのユーティリティがまとまっていると便利ですね。

comments powered by Disqus