summaryrefslogtreecommitdiff
path: root/benchmark-suite/benchmarks
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2010-10-13 01:31:19 +0200
committerLudovic Courtès <ludo@gnu.org>2010-10-13 01:31:19 +0200
commite78d4bf9a9501654024a18f8d0baa1597d57fcb8 (patch)
treebaac08c8bcab8232ff9babdad2511236ecb12b2f /benchmark-suite/benchmarks
parentde6b3a5cb919534773e9bde571bdf500dc604eff (diff)
Optimize `1+' and `1-' on fixnums.
* libguile/vm-i-scheme.c (INUM_MAX, INUM_MIN): New macros. (add1, sub1): Add/subtract without untagging the operand. This leads to a 44% run time improvement compared to the previous implementation. * libguile/vm.c: Include <stdint.h>. * test-suite/tests/numbers.test ("1+", "1-"): Add tests for MOST-POSITIVE-FIXNUM, resp. MOST-NEGATIVE-FIXNUM, for 32-bit and 34-bit values thereof. * benchmark-suite/benchmarks/arithmetic.bm: New file. * benchmark-suite/Makefile.am (SCM_BENCHMARKS): Add it.
Diffstat (limited to 'benchmark-suite/benchmarks')
-rw-r--r--benchmark-suite/benchmarks/arithmetic.bm46
1 files changed, 46 insertions, 0 deletions
diff --git a/benchmark-suite/benchmarks/arithmetic.bm b/benchmark-suite/benchmarks/arithmetic.bm
new file mode 100644
index 000000000..cd8bbbd7b
--- /dev/null
+++ b/benchmark-suite/benchmarks/arithmetic.bm
@@ -0,0 +1,46 @@
+;;; -*- mode: scheme; coding: utf-8; -*-
+;;; Integer arithmetic.
+;;;
+;;; Copyright 2010 Free Software Foundation, Inc.
+;;;
+;;; This program is free software; you can redistribute it and/or
+;;; modify it under the terms of the GNU Lesser General Public License
+;;; as published by the Free Software Foundation; either version 3, or
+;;; (at your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;; GNU Lesser General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Lesser General Public
+;;; License along with this software; see the file COPYING.LESSER. If
+;;; not, write to the Free Software Foundation, Inc., 51 Franklin
+;;; Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+(define-module (benchmarks arithmetic)
+ #:use-module (benchmark-suite lib))
+
+(define-syntax repeat
+ (lambda (s)
+ ;; Construct an expression of the form `(OP (OP (OP BODY)))', with a
+ ;; depth of COUNT.
+ (syntax-case s ()
+ ((_ op body count)
+ (number? (syntax->datum #'count))
+ (let loop ((count (syntax->datum #'count))
+ (result #'body))
+ (if (= 0 count)
+ result
+ (loop (1- count)
+ (with-syntax ((result result))
+ #'(op result)))))))))
+
+
+(with-benchmark-prefix "fixnum"
+
+ (benchmark "1+" 1e7
+ (repeat 1+ 2 100))
+
+ (benchmark "1-" 1e7
+ (repeat 1- 2 100)))