65.9K
CodeProject is changing. Read more.
Home

Tick, Tock… Time Waits for No One

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1 vote)

Jan 6, 2014

MIT

1 min read

viewsIcon

5924

Time does not wait for anyone

Ok, so what I am about to discuss might be old news for most, but for me, it’s new. After discovering this, I have to admit that I am a bit disappointed in myself for not already knowing this.

When implementing asynchronous methods in Node, I had always done the following:

function asynchProcessFunc = function(callback) {
    setTimeout(function(callback){
        // process the request now
        callback(returnData);
    }, 0);

    // return back 
};

It was recommended by someone that I change this out for the process.nextTick(cb) method. Being a firmware developer in previous lifetimes, the pure mention of tick had me intrigued.

Was it actually processing CPU ticks?

Turns out the answer was No, but still what I did find was something far better than a zero based timeout. I had always known that setTimeout(cb, timer) with a zero based timer was never going to be accurate, but I had decided it was the best I could ever get.

To get an idea of a difference between the two, I wrote the following to measure setTimeout:

setTimeout(function(){
    var startTime = process.hrtime();

    setTimeout(function() {
        var timeDiff = process.hrtime(startTime);
        console.log('setTimeout time diff - ', timeDiff[0]*1e9 + timeDiff[1], '(nanoSecs)');
    }, 0);
}, 1000);

I rounded the average rate to 1600000.

I then changed the program to use process.nextTick() like the following:

setTimeout(function(){
    var startTime = process.hrtime();

    process.nextTick(function() {
        var timeDiff = process.hrtime(startTime);
        console.log('nextTick time diff - ', timeDiff[0]*1e9 + timeDiff[1], '(nanoSecs)');
    });	
}, 1000);

I rounded the average rate to 400000, which gives me a difference of about 4x performance increase. Depending on your product, this I am sure will change but even the improvement comes in at 2x that is still a major performance increase.

Happy coding everyone.