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.78 | 7.89 | 5.70 |
2回目 | 40.49 | 8.00 | 5.90 |
3回目 | 40.79 | 8.30 | 6.02 |
平均 | 41.02 | 8.06 | 5.87 |
elとの比 | 1.00 | 0.20 | 0.14 |
バイトコンパイルが苦手なものとかがあれば、それでも試してみたいけど、何がいいんだろうか。
関連記事
- init.elの大掃除
- Corfuでispellのエラーが出たので対処
- Emacsサマーフェスで登壇してきた
- Emacs 30で導入される予定のおもしろい機能の紹介
- Emacs 29で導入される予定のおもしろい機能の紹介
comments powered by
Disqus
Share