oinak
11/13/2016 - 11:29 AM

Basic performance comparison ruby/mruby (interpreted, mrb bytecode, c bytecode) with fibonacci(40)

Basic performance comparison ruby/mruby (interpreted, mrb bytecode, c bytecode) with fibonacci(40)

#include <stdint.h>
const uint8_t fib_symbol[] = {
0x52,0x49,0x54,0x45,0x30,0x30,0x30,0x32,0xb2,0xe1,0x00,0x00,0x01,0x52,0x4d,0x41,
0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x01,0x34,0x30,0x30,
0x30,0x30,0x00,0x00,0x00,0xbb,0x00,0x03,0x00,0x07,0x00,0x01,0x00,0x00,0x00,0x1a,
0x01,0x80,0x00,0x48,0x02,0x00,0x00,0xc0,0x01,0x80,0x00,0x46,0x01,0x80,0x00,0x91,
0x01,0x80,0x80,0x20,0x00,0x80,0xc0,0x01,0x01,0x80,0x00,0x06,0x02,0x00,0x00,0x3d,
0x02,0x80,0x00,0x06,0x03,0x40,0x13,0x83,0x02,0x80,0x00,0xa0,0x02,0x01,0x40,0x3e,
0x01,0x80,0xc0,0xa0,0x01,0x80,0x00,0x91,0x01,0x80,0x80,0x20,0x02,0x00,0x40,0x01,
0x01,0x81,0x00,0xae,0x01,0x00,0xc0,0x01,0x01,0x80,0x00,0x06,0x02,0x00,0x01,0x3d,
0x02,0x80,0x80,0x01,0x02,0x01,0x40,0x3e,0x02,0x80,0x01,0xbd,0x02,0x01,0x40,0x3e,
0x01,0x80,0xc0,0xa0,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x04,0x00,0x00,0x09,0x46,
0x69,0x62,0x28,0x34,0x30,0x29,0x3d,0x20,0x00,0x00,0x00,0x00,0x00,0x09,0x20,0x20,
0x54,0x69,0x6d,0x65,0x20,0x3d,0x20,0x00,0x00,0x01,0x73,0x00,0x00,0x00,0x05,0x00,
0x03,0x66,0x69,0x62,0x00,0x00,0x04,0x54,0x69,0x6d,0x65,0x00,0x00,0x03,0x6e,0x6f,
0x77,0x00,0x00,0x04,0x70,0x75,0x74,0x73,0x00,0x00,0x01,0x2d,0x00,0x00,0x00,0x00,
0x6d,0x00,0x03,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x11,0x02,0x00,0x00,0x26,0x01,
0x80,0x40,0x01,0x02,0x40,0x00,0x03,0x01,0x80,0x00,0xb4,0x01,0xc0,0x01,0x19,0x01,
0xc0,0x00,0x03,0x00,0x40,0x04,0x97,0x01,0x80,0x00,0x06,0x02,0x00,0x40,0x01,0x02,
0x00,0x80,0xaf,0x01,0x80,0x40,0xa0,0x02,0x00,0x00,0x06,0x02,0x80,0x40,0x01,0x02,
0x80,0x81,0x2f,0x02,0x00,0x40,0xa0,0x01,0x80,0xc0,0xac,0x01,0x80,0x00,0x29,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x3c,0x3d,0x00,0x00,0x03,0x66,0x69,
0x62,0x00,0x00,0x01,0x2d,0x00,0x00,0x01,0x2b,0x00,0x45,0x4e,0x44,0x00,0x00,0x00,
0x00,0x08,
};
def fib(n)
  if n <= 1
    1
  else
    fib(n - 1) + fib(n - 2)
  end
end

t0 = Time.now
puts "Fib(40)= #{ fib(40) }"
t = Time.now - t0
puts "  Time = #{ t }s"
#include "mruby.h"
#include "mruby/irep.h"
#include "fib.c"

int main(void)
{
  mrb_state *mrb = mrb_open();
  if (!mrb) { /* handle error */ }
  mrb_load_irep(mrb, fib_symbol);
  mrb_close(mrb);
}
#include<stdio.h>
#include<time.h>

int fib(int n){
  if (n <= 1){
    return 1;
  } else {
    return fib(n -1)+ fib(n - 2);
  }
}

int main()
{
   clock_t t0 = clock();
   long f = fib(40);
   clock_t t1 = clock();
   double te = ((double)(t1 - t0)) / CLOCKS_PER_SEC;
   printf("Fib(40)=%d, time=%f\n", f, te);
   return 0;
}
#include<stdio.h>
#include<time.h>

int fib(int n){
  int first = 0, second = 1, next, c;

  for ( c = 0 ; c < n ; c++ )
  {
    if ( c <= 1 ) {
      next = c;
    } else {
      next = first + second;
      first = second;
      second = next;
    }
  }
  return next;
}

int main()
{
   clock_t t0 = clock();
   long f = fib(40);
   clock_t t1 = clock();
   double te = ((double)(t1 - t0)) / CLOCKS_PER_SEC;
   printf("Fib(40)=%d, time=%f\n", f, te);
   return 0;
}
fer@hecate /tmp/mruby  [ruby-2.3.1]
$ ruby fib.rb 
Fib(40)= 165580141
  Time = 18.012413533s

fer@hecate /tmp/mruby  [ruby-2.3.1]
$ rvm use mruby
Using /home/fer/.rvm/gems/mruby-1.0.0
Warning! Executable 'gem' missing, something went wrong with this ruby installation!

fer@hecate /tmp/mruby  [mruby-1.0.0]
$ mruby fib.rb 
Fib(40)= 165580141
  Time = 33.551006s

fer@hecate /tmp/mruby  [mruby-1.0.0]
$ mrbc fib.rb 

fer@hecate /tmp/mruby  [mruby-1.0.0]
$ mruby -b fib.mrb 
Fib(40)= 165580141
  Time = 32.033073s

fer@hecate /tmp/mruby  [mruby-1.0.0]
$ mrbc -Bfib_symbol fib.rb 

fer@hecate /tmp/mruby  [mruby-1.0.0]
$ ls
fib.c  fib.mrb  fib.rb  test_program  test_stub.c

fer@hecate /tmp/mruby  [mruby-1.0.0]
$ vi fib_main.c

fer@hecate /tmp/mruby  [mruby-1.0.0]
$ gcc -std=c99 -I/home/fer/.rvm/rubies/mruby-1.0.0/include fib_main.c -o fib.exe -lm /home/fer/.rvm/src/mruby-1.0.0/build/host/lib/libmruby.a

fer@hecate /tmp/mruby  [mruby-1.0.0]
$ ls
fib.c  fib.exe  fib_main.c  fib.mrb  fib.rb

fer@hecate /tmp/mruby  [mruby-1.0.0]
$ ./fib.exe 
Fib(40)= 165580141
  Time = 30.911468s
  
fer@hecate /tmp/mruby  [mruby-1.0.0]
$ vi fib_native.c

fer@hecate /tmp/mruby  [mruby-1.0.0]
$ gcc -std=c99 fib_native.c -o fib_native.exe

fer@hecate /tmp/mruby  [mruby-1.0.0]
$ ./fib_native.exe 
Fib(40)=165580141, time=0.971636

fer@hecate /tmp/mruby  [mruby-1.0.0]
$ vi fib_native_for.c

fer@hecate /tmp/mruby  [mruby-1.0.0]
$ gcc -std=c99 fib_native_for.c -o fib_native_for.exe

fer@hecate /tmp/mruby  [mruby-1.0.0]
$ ./fib_native_for.exe 
Fib(40)=63245986, time=0.000002