Saturday, February 12, 2011

Speed of execution of the Fibonnaci() in Python v2.7, Ruby v1.9.2 and JavaScript (Node.Js v.0.2.6)

This week i was writing some JavaScript running on Node.JS (Windows XP 32B), to generate data to be saved in MongoDB once the script is executed in MongoDB console.

I was creating 1 million invoices like the one below generating random date, random number of items (max 10) and pulling customers and products information out of lists randomly.

It was so fast, I thought there was something wrong with my code. Well there was nothing wrong
with my code JavaScript V8 is just super fast.

This is the JSon of a typical invoice generated once in MongoDB.

{
"InvoiceID"     : 5000,
"Customer"      : { "Name" : "Hot Stuff Foods", "ID" : 22 },
"ArchiveDate"   : "Tue May 20 2008 00:00:00 GMT-0400 (Eastern Daylight Time)",
"Date"          : "Sat Feb 12 2011 00:29:08 GMT-0500 (Eastern Standard Time)",
"TotalInvoice"  : 188.11,
"Status"        : "Unknown",
"Items" : [
        {
                "Product" : {
                        "Name"  : "CHI-CHI'S Con Queso",
                        "Price" : 1.3,
                        "ID"    : 2
                },
                "Price"     : 1.3,
                "Quantity"  : 8,
                "TotalItem" : 10.4
        },
        {
                "Product" : {
                        "Name"  : "Di Lusso Mediterranean Mixed Olives",
                        "Price" : 8.99,
                        "ID"    : 182
                },
                "Price"     : 8.99,
                "Quantity"  : 9,
                "TotalItem" : 80.91
        },
        {
                "Product" : {
                        "Name"  : "CHI-CHI'S Fiesta Sweet Corn Cake Mix",
                        "Price" : 8.9,
                        "ID"    : 56
                },
                "Price"     : 8.9,
                "Quantity"  : 2,
                "TotalItem" : 17.8
        },
        {
                "Product" : {
                        "Name"  : "CHI-CHI'S Fiesta PlatesT Creamy Chipotle Chicken",
                        "Price" : 7.8,
                        "ID"    : 12
                },
                "Price"     : 7.8,
                "Quantity"  : 1,
                "TotalItem" : 7.8
        },
        {
                "Product" : {
                        "Name"  : "CHI-CHI'S Fiesta Sweet Corn Cake Mix",
                        "Price" : 8.9,
                        "ID"    : 56
                },
                "Price"     : 8.9,
                "Quantity"  : 8,
                "TotalItem" : 71.2
        }
        ]
}

So I decided to compare Python, Ruby and JavaScript using Fibonnaci() in iterative mode.

Python


import datetime

def Fibonnaci(n):
    previous = -1
    result   =  1
    for i in range(n+1):
        sum         = result + previous
        previous    = result
        result      = sum
    return result

print "Python %s" % datetime.datetime.now()

for t in range(100):
    for i in range(1000):
        v = Fibonnaci(i)

print  "%s" % (datetime.datetime.now())

Ruby

def Fibonnaci(n)
    previous = -1
    result   =  1
    for i in (1..n)
        sum         = result + previous
        previous    = result
        result      = sum
    end
    result
end

p "Ruby #{Time.now}"
for t in (1..100)
    for i in (1..1000)
        v = Fibonnaci(i)
    end
end
p "#{Time.now}"  

JavaScript V8 tested on Node.js

function Fibonnaci(n){

    var previous = -1;
    var result   =  1;

    for(var i=0; i < n+1; i++){

        var sum  = result + previous;
        previous = result;
        result   = sum;
    }
    return result;
}

console.log("Node.js "+new Date());

for(var t=0; t < 100; t++){

    for(var i=0; i < 1000; i++){

        var v = Fibonnaci(i);
    }
}
console.log(new Date());


The results


I must be doing something wrong with my Ruby code. I do not understand why it is so slow.
But the speed of execution on JavaScript with V8 is incredible.

Python
2011-02-12 00:51:50
2011-02-12 00:52:03
13s

Ruby
2011-02-12 00:48:38
2011-02-12 00:49:24
46s

Node.js
Sat Feb 12 2011 05:50:50
Sat Feb 12 2011 05:50:50
1s

No comments:

Post a Comment