EmacsのNative Compilationの性能を測定する


Emacsに来たnative compileを試す--with-native-compilation オプション付で Emacsをビルドして、とりあえず eln ファイルができて、elファイルがコンパイルされるところは 見たので、今日はその性能について見てみた。

当然ネイティブコンパイルするからには、高速化されていることに期待。

検証用コード

https://www.emacswiki.org/emacs/EmacsLispBenchmark

を見て、バブルソートで測定するのが良さそうだったので拝借。 ただ、リストの数がある程度欲しかったので、10000のリストに対してソートするようにしている。

(defun bubble ()
  "."
  (let* ((list (mapcar 'random (make-list 10000 most-positive-fixnum)))
              (i (length list)))
         (while (> i 1)
           (let ((b list))
             (while (cdr b)
               (when (< (cadr b) (car b))
                 (setcar b (prog1 (cadr b)
                             (setcdr b (cons (car b) (cddr b))))))
               (setq b (cdr b))))
           (setq i (1- i)))
         list))

あとは、この関数を benchmark-run で実行することで、実行時間、GC回数、GC時間を取得することができる。

(benchmark-run (bubble))
;; => (41.7818347 0 0.0)

GCされてしまうと時間にブレが生じるので、GCされてないことが確認できればOK。

比較対象

比較の対象として、これまでの高速化手法であったバイトコンパイルと今回のネイティブコンパイルで比較してみた。

バイトコンパイルとの比較

M-x byte-compile-file でバイトコンパイルしたファイルをロードして同じく benchmark-run にかけた。

ネイティブコンパイルとの比較

M-x emacs-lisp-native-compile-and-load で開いているelファイルをネイティブコンパイルした上でロードできるので、 これを同じく benchmark-run にかけた。

比較結果

以下のとおり、バイトコンパイルより、ネイティブコンパイルはさらに高速化されることがわかる。

オリジナル(el)バイトコンパイル(elc)ネイティブコンパイル(elc)
1回目41.787.895.70
2回目40.498.005.90
3回目40.798.306.02
平均41.028.065.87
elとの比1.000.200.14

バイトコンパイルが苦手なものとかがあれば、それでも試してみたいけど、何がいいんだろうか。


See also

comments powered by Disqus