ecraven/r7rs-benchmarks

Benchmarks for various Scheme implementations. Taken with kind permission from the Larceny project, based on the Gabriel and Gambit benchmarks.

JavaScript

299

234 commits

updated Feb 3, 2026

See the code

README

* R7RS Benchmarks
Benchmarks for various Scheme implementations. Taken with kind permission from the Larceny project, based on the Gabriel and Gambit benchmarks.

See the results [[http://ecraven.github.io/r7rs-benchmarks/benchmark.html][here]]
* Running the tests
Just run 
#+BEGIN_SRC
./bench <scheme> <test>
#+END_SRC
Schemes that should work:
- [[https://www-sop.inria.fr/indes/fp/Bigloo][Bigloo]] (=bigloo=)
- [[http://www.call-with-current-continuation.org/bones][Bones]] (=bones=)
- [[http://scheme.com][Chez]] (=chez=)
- [[http://synthcode.com/scheme/chibi][Chibi]] (=chibi=)
- [[https://www.call-cc.org/][Chicken]] (=chicken=)
- [[http://justinethier.github.io/cyclone/][Cyclone]] (=cyclone=)
- [[https://github.com/leftmike/foment][Foment]] (=foment=)
- [[http://gambitscheme.org/wiki/index.php/Main_Page][GambitC]] (=gambitc=)
- [[http://practical-scheme.net/gauche/][Gauche]] (=gauche=)
- [[http://www.gnu.org/software/guile/][Guile]] (=guile=)
- [[https://github.com/IronScheme/IronScheme][IronScheme]] (=ironscheme=)
- [[http://www.gnu.org/software/kawa/][Kawa]] (=kawa=)
- [[http://www.larcenists.org/][Larceny]] (=larceny=)
- [[https://scheme.fail/][Loko]] (=loko=)
- [[https://www.gnu.org/software/mit-scheme/][MIT/GNU]] Scheme (=mit=)
- [[http://mosh.monaos.org][Mosh]] (=mosh=)
- [[http://scheme.com/][Petite Chez]] (=chez=)
- [[https://github.com/picrin-scheme/picrin][Picrin]] (=picrin=)
- [[https://racket-lang.org][Racket]] (=racket=)
- [[http://www.kt.rim.or.jp/~qfwfq/rhiz-pi/index-e.html][Rhizome/Pi]] (=rhizome=)
- [[http://www.rscheme.org][RScheme]] (=rscheme=)
- [[https://bitbucket.org/ktakashi/sagittarius-scheme/wiki/Home][Sagittarius]] (=sagittarius=)
- [[http://s48.org][Scheme48]] (=scheme48=)
- [[http://t3x.org/s9fes/][Scheme 9 from Empty Space]] (=s9fes=)
- [[https://gitlab.com/jobol/tr7][TR7, tiny R7RS interpreter]] (=TR7=)
- [[http://marcomaggi.github.io/vicare.html][Vicare]] (=vicare=)
- [[http://www.littlewingpinball.net/mediawiki/index.php/Ypsilon][Ypsilon]] (=ypsilon=)
This should result in a file =./results.<scheme>=.

All of these Schemes are packaged for ArchLinux. The tests are run with whatever that package produces.

Run
#+BEGIN_SRC
make csv
#+END_SRC
to produce a file =all.csv= with the test results (=<scheme>,<test>,<seconds>=).

** Limiting compile-time and run-time
The environment variable =CPU_TIME= can be set, to limit the time for compilation and for running (each individually).
#+BEGIN_SRC
CPU_TIME=3600 ./bench chez all
#+END_SRC
** Path to executables
You can set an environment variable to specify the path to each Scheme.
#+BEGIN_SRC
LARCENY=/tmp/larceny/larceny MIT=/tmp/mit/mit-scheme ./bench "mit larceny" "fib ack"
#+END_SRC
** Notes for specific implementations
*** Chicken
The chicken test code assumes the presence of
- vector-lib
- r7rs

Install them by running
#+BEGIN_SRC
chicken-install vector-lib r7rs
#+END_SRC
*** Racket
The racket test code assumes the presence of https://github.com/lexi-lambda/racket-r7rs.git.

Install the r7rs package installation-wide.

Run:
#+BEGIN_SRC
sudo raco pkg install --scope installation r7rs
#+END_SRC

*** IronScheme
Install the latest version of .NET Runtime (currently 9.0-preview, requires at least IronScheme 1.0.357) from https://dotnet.microsoft.com/en-us/download/dotnet .

The default binary for IronScheme (can be changed by exporting IRONSCHEME in your shell before running bench) is called =ironscheme=.

If you unpack IronScheme in your home, you can create a shell script like the following:
#+BEGIN_SRC
#!/bin/bash
export DOTNET_CLI_TELEMETRY_OPTOUT=1
dotnet ~/IronScheme/IronScheme.ConsoleCore.dll $*
#+END_SRC
and put that somewhere in your =$PATH=.
*** Stalin
Before calling Stalin, the code is run through [[http://petrofsky.org/src/alexpander.scm][alexpander]] (by default using Chicken's =csi=). Then stalin is invoked on the result.
** Unsupported Schemes
*** Owl Lisp
Missing a lot of necessary functions, =read= for example.
*** TinyScheme
Problems with redirecting input, =read= chokes. No timing functions.
** Safety
The benchmarking code does *not* use unsafe optimizations. These make code run even faster (but less safe ;)
Specific options that could be used are:
- Chez :: =--optimize-level 3=
- Gerbil / Gambit :: =(declare (not safe))=

Not written in Markdown, so it's shown here as plain text — view it formatted on GitHub.

Contributors

ecraven

194 commits

ArneBab

12 commits

leppie

5 commits

ecraven/r7rs-benchmarks

Benchmarks for various Scheme implementations. Taken with kind permission from the Larceny project, based on the Gabriel and Gambit benchmarks.

JavaScript

299

234 commits

updated Feb 3, 2026

See the code

README

* R7RS Benchmarks
Benchmarks for various Scheme implementations. Taken with kind permission from the Larceny project, based on the Gabriel and Gambit benchmarks.

See the results [[http://ecraven.github.io/r7rs-benchmarks/benchmark.html][here]]
* Running the tests
Just run 
#+BEGIN_SRC
./bench <scheme> <test>
#+END_SRC
Schemes that should work:
- [[https://www-sop.inria.fr/indes/fp/Bigloo][Bigloo]] (=bigloo=)
- [[http://www.call-with-current-continuation.org/bones][Bones]] (=bones=)
- [[http://scheme.com][Chez]] (=chez=)
- [[http://synthcode.com/scheme/chibi][Chibi]] (=chibi=)
- [[https://www.call-cc.org/][Chicken]] (=chicken=)
- [[http://justinethier.github.io/cyclone/][Cyclone]] (=cyclone=)
- [[https://github.com/leftmike/foment][Foment]] (=foment=)
- [[http://gambitscheme.org/wiki/index.php/Main_Page][GambitC]] (=gambitc=)
- [[http://practical-scheme.net/gauche/][Gauche]] (=gauche=)
- [[http://www.gnu.org/software/guile/][Guile]] (=guile=)
- [[https://github.com/IronScheme/IronScheme][IronScheme]] (=ironscheme=)
- [[http://www.gnu.org/software/kawa/][Kawa]] (=kawa=)
- [[http://www.larcenists.org/][Larceny]] (=larceny=)
- [[https://scheme.fail/][Loko]] (=loko=)
- [[https://www.gnu.org/software/mit-scheme/][MIT/GNU]] Scheme (=mit=)
- [[http://mosh.monaos.org][Mosh]] (=mosh=)
- [[http://scheme.com/][Petite Chez]] (=chez=)
- [[https://github.com/picrin-scheme/picrin][Picrin]] (=picrin=)
- [[https://racket-lang.org][Racket]] (=racket=)
- [[http://www.kt.rim.or.jp/~qfwfq/rhiz-pi/index-e.html][Rhizome/Pi]] (=rhizome=)
- [[http://www.rscheme.org][RScheme]] (=rscheme=)
- [[https://bitbucket.org/ktakashi/sagittarius-scheme/wiki/Home][Sagittarius]] (=sagittarius=)
- [[http://s48.org][Scheme48]] (=scheme48=)
- [[http://t3x.org/s9fes/][Scheme 9 from Empty Space]] (=s9fes=)
- [[https://gitlab.com/jobol/tr7][TR7, tiny R7RS interpreter]] (=TR7=)
- [[http://marcomaggi.github.io/vicare.html][Vicare]] (=vicare=)
- [[http://www.littlewingpinball.net/mediawiki/index.php/Ypsilon][Ypsilon]] (=ypsilon=)
This should result in a file =./results.<scheme>=.

All of these Schemes are packaged for ArchLinux. The tests are run with whatever that package produces.

Run
#+BEGIN_SRC
make csv
#+END_SRC
to produce a file =all.csv= with the test results (=<scheme>,<test>,<seconds>=).

** Limiting compile-time and run-time
The environment variable =CPU_TIME= can be set, to limit the time for compilation and for running (each individually).
#+BEGIN_SRC
CPU_TIME=3600 ./bench chez all
#+END_SRC
** Path to executables
You can set an environment variable to specify the path to each Scheme.
#+BEGIN_SRC
LARCENY=/tmp/larceny/larceny MIT=/tmp/mit/mit-scheme ./bench "mit larceny" "fib ack"
#+END_SRC
** Notes for specific implementations
*** Chicken
The chicken test code assumes the presence of
- vector-lib
- r7rs

Install them by running
#+BEGIN_SRC
chicken-install vector-lib r7rs
#+END_SRC
*** Racket
The racket test code assumes the presence of https://github.com/lexi-lambda/racket-r7rs.git.

Install the r7rs package installation-wide.

Run:
#+BEGIN_SRC
sudo raco pkg install --scope installation r7rs
#+END_SRC

*** IronScheme
Install the latest version of .NET Runtime (currently 9.0-preview, requires at least IronScheme 1.0.357) from https://dotnet.microsoft.com/en-us/download/dotnet .

The default binary for IronScheme (can be changed by exporting IRONSCHEME in your shell before running bench) is called =ironscheme=.

If you unpack IronScheme in your home, you can create a shell script like the following:
#+BEGIN_SRC
#!/bin/bash
export DOTNET_CLI_TELEMETRY_OPTOUT=1
dotnet ~/IronScheme/IronScheme.ConsoleCore.dll $*
#+END_SRC
and put that somewhere in your =$PATH=.
*** Stalin
Before calling Stalin, the code is run through [[http://petrofsky.org/src/alexpander.scm][alexpander]] (by default using Chicken's =csi=). Then stalin is invoked on the result.
** Unsupported Schemes
*** Owl Lisp
Missing a lot of necessary functions, =read= for example.
*** TinyScheme
Problems with redirecting input, =read= chokes. No timing functions.
** Safety
The benchmarking code does *not* use unsafe optimizations. These make code run even faster (but less safe ;)
Specific options that could be used are:
- Chez :: =--optimize-level 3=
- Gerbil / Gambit :: =(declare (not safe))=

Not written in Markdown, so it's shown here as plain text — view it formatted on GitHub.

Contributors

ecraven

194 commits

ArneBab

12 commits

leppie

5 commits

Languages

JavaScript

58.2%

Scheme

21.7%

HTML

12.9%

Tree-sitter Query

5.2%

TeX

1.4%