« September 6, 2017 | Main | September 12, 2017 »
Saturday, September 9, 2017
Floating Point Benchmark: Scala Language Added
I have posted an update to my trigonometry-intense floating point benchmark which adds Scala to the list of languages in which the benchmark is implemented. A new release of the benchmark collection including Scala is now available for downloading. Scala is a general purpose programming language originally developed at the École Polytechnique Fédérale in Lausanne, Switzerland. Scala combines the paradigm of functional programming with support for conventional object-oriented imperative programming, allowing the programmer to choose whichever style is most expressive of the algorithm being implemented. Unlike Haskell, which forces the programmer into a strict functional style, Scala contains control structures for iteration, mutable variables, and a syntax which C and Java programmers will find familiar. Scala runs on the Java virtual machine, and Scala and Java code can interoperate, which provides Scala access to all existing Java libraries. The Scala version of the benchmark was developed and tested using Scala 2.12.3 on an x86_64 machine running Xubuntu 16.04 kernel 4.4.0-93. In order to compile and run this program you must install Scala on your computer. Scala programs compile to byte code which is executed by an implementation of the Java virtual machine. I ran these tests using:openjdk version "9-internal"The Scala implementation of the floating point benchmark is written mostly in a pure functional style, but I did use mutable variables and iteration where it made the code more readable. Scala does not optimise tail recursion as aggressively as Haskell, so iteration may be more efficient in heavily-used code. At the time I developed this benchmark, a recent release of the GNU C mathematical function library had been issued which halved the mean execution speed of trigonometric functions. This made all comparisons of run time against the C reference implementation of the benchmark using the earlier, more efficient libraries, invalid. (It's said that the performance hit was done in the interest of improved accuracy, but it made no difference in the computations of the floating point benchmark, which are checked to 13 significant digits.) Consequently, I compared the execution speed of the Scala implementation against that of the Java version, then computed the speed relative to the original C version with the old libraries by multiplying the relative speed of Java vs. C and Scala vs. Java. The relative performance of the various language implementations (with C taken as 1) is as follows. All language implementations of the benchmark listed below produced identical results to the last (11th) decimal place.
OpenJDK Runtime Environment (build 9-internal+0-2016-04-14-195246.buildd.src)
OpenJDK 64-Bit Server VM (build 9-internal+0-2016-04-14-195246.buildd.src, mixed mode)
Language | Relative Time |
Details |
---|---|---|
C | 1 | GCC 3.2.3 -O3, Linux |
Visual Basic .NET | 0.866 | All optimisations, Windows XP |
FORTRAN | 1.008 | GNU Fortran (g77) 3.2.3 -O3, Linux |
Pascal | 1.027 1.077 |
Free Pascal 2.2.0 -O3, Linux GNU Pascal 2.1 (GCC 2.95.2) -O3, Linux |
Swift | 1.054 | Swift 3.0.1, -O, Linux |
Rust | 1.077 | Rust 0.13.0, --release, Linux |
Java | 1.121 | Sun JDK 1.5.0_04-b05, Linux |
Visual Basic 6 | 1.132 | All optimisations, Windows XP |
Haskell | 1.223 | GHC 7.4.1-O2 -funbox-strict-fields, Linux |
Scala | 1.263 | Scala 2.12.3, OpenJDK 9, Linux |
Ada | 1.401 | GNAT/GCC 3.4.4 -O3, Linux |
Go | 1.481 | Go version go1.1.1 linux/amd64, Linux |
Simula | 2.099 | GNU Cim 5.1, GCC 4.8.1 -O2, Linux |
Lua | 2.515 22.7 |
LuaJIT 2.0.3, Linux Lua 5.2.3, Linux |
Python | 2.633 30.0 |
PyPy 2.2.1 (Python 2.7.3), Linux Python 2.7.6, Linux |
Erlang | 3.663 9.335 |
Erlang/OTP 17, emulator 6.0, HiPE [native, {hipe, [o3]}] Byte code (BEAM), Linux |
ALGOL 60 | 3.951 | MARST 2.7, GCC 4.8.1 -O3, Linux |
Lisp | 7.41 19.8 |
GNU Common Lisp 2.6.7, Compiled, Linux GNU Common Lisp 2.6.7, Interpreted |
Smalltalk | 7.59 | GNU Smalltalk 2.3.5, Linux |
Forth | 9.92 | Gforth 0.7.0, Linux |
COBOL | 12.5 46.3 |
Micro Focus Visual COBOL 2010, Windows 7 Fixed decimal instead of computational-2 |
Algol 68 | 15.2 | Algol 68 Genie 2.4.1 -O3, Linux |
Perl | 23.6 | Perl v5.8.0, Linux |
Ruby | 26.1 | Ruby 1.8.3, Linux |
JavaScript | 27.6 39.1 46.9 |
Opera 8.0, Linux Internet Explorer 6.0.2900, Windows XP Mozilla Firefox 1.0.6, Linux |
QBasic | 148.3 | MS-DOS QBasic 1.1, Windows XP Console |
Mathematica | 391.6 | Mathematica 10.3.1.0, Raspberry Pi 3, Raspbian |