pichi / fib

Performance Benchmark of top Github languages

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Recursive Fibonacci Benchmark using top languages on Github

Top 10: JavaScript, Java, Python, Ruby, Php, C++, C#, C, Go reference

Others: Crystal, Rust, Swift, Mono, Elixir, Perl, R, Julia, D, Nim

This code performs a recursive fibonacci to the 46th position with the result of 2,971,215,073.

Fibonacci can be written many different ways. The goal of this project is to compare how each language handles the exact same code.

Here is the Ruby version:

def fib(n)
  return 1 if n <= 1
  fib(n - 1) + fib(n - 2)
end

puts fib(46)

Here is the Crystal version:

def fib(n : UInt64)
  return 1_u64 if n <= 1
  fib(n - 1) + fib(n - 2)
end

puts fib(46)

All tests are run on:

  • iMac (Retina 5K, 27-inch, Late 2015)
  • OS: macOS High Sierra 10.13.6
  • Processor: 3.2 GHz Intel Core i5
  • Memory: 16 GB 1867 MHz DDR3

Last benchmark was ran on September 30, 2018

Natively compiled, statically typed

Language Time, s Compile Run
Nim 4.696 nim cpp -d:release fib.nim time ./fib
C 4.697 gcc -O3 -o fib fib.c time ./fib
C++ 4.700 g++ -O3 -o fib fib.cpp time ./fib
Crystal 5.843 crystal build --release fib.cr time ./fib
Cython 6.013 cython --embed -o fib.pyx.c fib.pyx && \
gcc -O3 -o fib fib.pyx.c \
$(pkg-config --cflags --libs python3) time ./fib
Fortran 6.191 gfortran -O3 -o fib fib.f03 time ./fib
Rust 6.677 rustc -O fib.rs time ./fib
D 7.264 ldc2 -O3 -release -flto=full -of=fib fib.d time ./fib
Haskell 8.207 ghc -O3 -o fib fib.hs time ./fib
OCaml 8.241 ocamlopt -O3 -o fib fib.ml time ./fib
Swift 10.742 swiftc -O -g fib.swift time ./fib
Go 11.055 go build fib.go time ./fib
Lisp 13.463 sbcl --load fib.lisp time ./fib

VM compiled bytecode, statically/dynamically type

Language Time, s Compile Run
Java 7.556 javac Fib.java time java Fib
C# 11.387 dotnet build -c Release -o ./bin time dotnet ./bin/fib.dll
C# (Mono) 12.310 mcs fib.cs time mono fib.exe
Erlang 13.522 erlc +native +'{hipe,[o3]}' fib.erl time erl -noinput -s fib

VM compiled before execution, mixed/dynamically typed

Language Time, s Run
Dart 9.651 time dart fib.dart
Julia 11.461 time julia -O3 fib.jl
Escript 13.706 time escript fib.es
Elixir* 13.955 time elixir fib.exs
Node 19.161 time node fib.js
  • Elixir is using ERL_COMPILER_OPTIONS='[native,{hipe, [o3]}]'

NOTE: These languages include compilation time that should be taken into consideration when comparing.

Interpreted, dynamically typed

Language Time, s Run
Scheme 150.454 time guile fib.scm
Php 198.279 time php fib.php
Ruby 200.168 time ruby fib.rb
Lua 280.999 time lua fib.lua
Python 515.008 time python fib.py
Python3 770.082 time python3 fib.py
Perl 1039.727 time perl fib.pl
Perl 6 2851.994 time perl6 fib.p6
Tcl TODO time tclsh fib.tcl
R 1796.495 time r -f fib.r
K TODO time k fib.k
Bash TODO time bash fib.sh

NOTE: Interpreted languages have a startup time cost that should be taken into consideration when comparing.

Optimized code that breaks the benchmark

The code examples provided in the optimized folder use techniques that break the benchmark. They do not perform the same internal tasks as the other examples so are not a good for an apples to apples comparison. They all perform at sub-second response times. It demonstrates that all benchmarks will have some caveat.

Several of these examples add very little changes to the original code that are worth mentioning:

  • The C++ constexpr is using a constexpr which optimizes the recursive call to a constant.
  • The Lisp compiletime shows how you can perform the calculation at compile time. simply add #. before outputing the results.
  • The Python lru_cache is using lru_cache directive with no code changes.
  • The Ruby mem and JS mem are maintaining a simple cache to avoid recalculating the results for that value.

Versions

  • go version go1.11 darwin/amd64
  • g++-8 (Homebrew GCC 8.2.0) 8.2.0
  • crystal Crystal 0.26.1 (2018-08-27) LLVM: 6.0.1
  • g++ Apple LLVM version 10.0.0 (clang-1000.11.45.2)
  • gcc Apple LLVM version 10.0.0 (clang-1000.11.45.2)
  • nim Nim Compiler Version 0.18.0 [MacOSX: amd64]
  • swiftc Apple Swift version 4.2 (swiftlang-1000.11.37.1 clang-1000.11.45.1)
  • rustc 1.29.0
  • javac 10.0.1
  • mcs Mono C# compiler version 5.12.0.226
  • dotnet 2.1.4
  • dart Dart VM version: 2.0.0 (Fri Aug 3 10:53:23 2018 +0200)
  • julia version 0.6.3
  • node v9.4.0
  • elixir Elixir 1.7.3 (compiled with Erlang/OTP 21)
  • ruby 2.5.1p57 (2018-03-29 revision 63029)
  • php 7.1.16 (cli) (built: Apr 1 2018 13:14:42)
  • python 2.7.15
  • python3 3.7.0
  • perl 5, version 26, subversion 2 (v5.26.2)
  • perl6 This is Rakudo Star version 2018.06 built on MoarVM version 2018.06
  • r version 3.5.0 (2018-04-23)
  • lcd2 the LLVM D compiler (1.11.0)
  • ocaml The OCaml toplevel, version 4.07.0
  • ghc The Glorious Glasgow Haskell Compilation System, version 8.4.3
  • gfortran GNU Fortran (Homebrew GCC 8.2.0) 8.2.0
  • tchsh 8.5

Caveats

Fibonacci Benchmark

About

Performance Benchmark of top Github languages


Languages

Language:Ruby 36.3%Language:Dockerfile 19.0%Language:Common Lisp 12.6%Language:Go 2.8%Language:Nim 2.7%Language:C++ 2.2%Language:Fortran 2.0%Language:Python 1.9%Language:Lua 1.8%Language:Erlang 1.8%Language:JavaScript 1.5%Language:Java 1.3%Language:Perl 6 1.3%Language:C# 1.3%Language:C 1.2%Language:Shell 0.9%Language:Tcl 0.9%Language:D 0.8%Language:Rust 0.7%Language:OCaml 0.7%Language:Swift 0.7%Language:Elixir 0.7%Language:PHP 0.7%Language:Dart 0.7%Language:Haskell 0.7%Language:Scheme 0.6%Language:Clojure 0.6%Language:R 0.6%Language:Julia 0.6%Language:Crystal 0.5%