aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lisp/emacs-lisp/benchmark.el6
-rw-r--r--test/lisp/emacs-lisp/benchmark-tests.el51
2 files changed, 53 insertions, 4 deletions
diff --git a/lisp/emacs-lisp/benchmark.el b/lisp/emacs-lisp/benchmark.el
index 25eddf5f6b0..a2217d20953 100644
--- a/lisp/emacs-lisp/benchmark.el
+++ b/lisp/emacs-lisp/benchmark.el
@@ -1,4 +1,4 @@
1;;; benchmark.el --- support for benchmarking code 1;;; benchmark.el --- support for benchmarking code -*- lexical-binding: t -*-
2 2
3;; Copyright (C) 2003-2017 Free Software Foundation, Inc. 3;; Copyright (C) 2003-2017 Free Software Foundation, Inc.
4 4
@@ -33,6 +33,7 @@
33 33
34(defmacro benchmark-elapse (&rest forms) 34(defmacro benchmark-elapse (&rest forms)
35 "Return the time in seconds elapsed for execution of FORMS." 35 "Return the time in seconds elapsed for execution of FORMS."
36 (declare (indent 0) (debug t))
36 (let ((t1 (make-symbol "t1")) 37 (let ((t1 (make-symbol "t1"))
37 (t2 (make-symbol "t2"))) 38 (t2 (make-symbol "t2")))
38 `(let (,t1 ,t2) 39 `(let (,t1 ,t2)
@@ -41,9 +42,6 @@
41 (setq ,t2 (current-time)) 42 (setq ,t2 (current-time))
42 (float-time (time-subtract ,t2 ,t1))))) 43 (float-time (time-subtract ,t2 ,t1)))))
43 44
44(put 'benchmark-elapse 'edebug-form-spec t)
45(put 'benchmark-elapse 'lisp-indent-function 0)
46
47;;;###autoload 45;;;###autoload
48(defmacro benchmark-run (&optional repetitions &rest forms) 46(defmacro benchmark-run (&optional repetitions &rest forms)
49 "Time execution of FORMS. 47 "Time execution of FORMS.
diff --git a/test/lisp/emacs-lisp/benchmark-tests.el b/test/lisp/emacs-lisp/benchmark-tests.el
new file mode 100644
index 00000000000..14426aeec41
--- /dev/null
+++ b/test/lisp/emacs-lisp/benchmark-tests.el
@@ -0,0 +1,51 @@
1;;; benchmark-tests.el --- Test suite for benchmark. -*- lexical-binding: t -*-
2
3;; Copyright (C) 2017 Free Software Foundation, Inc.
4
5;; This file is part of GNU Emacs.
6
7;; GNU Emacs is free software: you can redistribute it and/or modify
8;; it under the terms of the GNU General Public License as published by
9;; the Free Software Foundation, either version 3 of the License, or
10;; (at your option) any later version.
11
12;; GNU Emacs is distributed in the hope that it will be useful,
13;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15;; GNU General Public License for more details.
16
17;; You should have received a copy of the GNU General Public License
18;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
19
20;;; Code:
21
22(require 'benchmark)
23(require 'ert)
24
25(ert-deftest benchmark-tests ()
26 (let (str t-long t-short)
27 (should (consp (benchmark-run nil (1+ 0))))
28 (should (consp (benchmark-run 1 (1+ 0))))
29 (should (stringp (benchmark nil (1+ 0))))
30 (should (stringp (benchmark 1 (1+ 0))))
31 (should (consp (benchmark-run-compiled nil (1+ 0))))
32 (should (consp (benchmark-run-compiled 1 (1+ 0))))
33 ;; First test is heavier, must need longer time.
34 (should (> (car (benchmark-run nil
35 (let ((n 100000)) (while (> n 1) (setq n (1- n))))))
36 (car (benchmark-run nil (1+ 0)))))
37 (should (> (car (benchmark-run nil
38 (let ((n 100000)) (while (> n 1) (setq n (1- n))))))
39 (car (benchmark-run nil (1+ 0)))))
40 (should (> (car (benchmark-run-compiled nil
41 (let ((n 100000)) (while (> n 1) (setq n (1- n))))))
42 (car (benchmark-run-compiled nil (1+ 0)))))
43 (setq str (benchmark nil '(let ((n 100000)) (while (> n 1) (setq n (1- n))))))
44 (string-match "Elapsed time: \\([0-9.]+\\)" str)
45 (setq t-long (string-to-number (match-string 1 str)))
46 (setq str (benchmark nil '(1+ 0)))
47 (string-match "Elapsed time: \\([0-9.]+\\)" str)
48 (setq t-short (string-to-number (match-string 1 str)))
49 (should (> t-long t-short))))
50
51;;; benchmark-tests.el ends here.