Skip to content

Instantly share code, notes, and snippets.

@trevnorris
Created May 13, 2015 17:10
Show Gist options
  • Select an option

  • Save trevnorris/b475bf806cd72f9da9a6 to your computer and use it in GitHub Desktop.

Select an option

Save trevnorris/b475bf806cd72f9da9a6 to your computer and use it in GitHub Desktop.
Observe the performance difference between finally and catch
'use strict';
const ITER = 1e7;
function parseArgs(args, start) {
var arr = [];
for (var i = start; i < args.length; i++)
arr.push(args[i]);
return arr;
}
function failSafely(ctx, cb, fail) {
var args = undefined;
var args_len = arguments.length;
var ret;
if (args_len > 6)
args = parseArgs(arguments, 3);
try {
if (args_len > 6 || ctx)
ret = cb.apply(ctx, args);
if (args_len === 3)
ret = cb();
else if (args_len === 4)
ret = cb(arguments[3]);
else if (args_len === 5)
ret = cb(arguments[3], arguments[4]);
else if (args_len === 6)
ret = cb(arguments[2], arguments[4], arguments[5]);
else
throw new Error('UNREACHABLE');
// Switch to "finally"
} catch(e) {
if (args_len > 6 || ctx)
fail.apply(ctx, args);
if (args_len === 3)
fail();
else if (args_len === 4)
fail(arguments[3]);
else if (args_len === 5)
fail(arguments[3], arguments[4]);
else if (args_len === 6)
fail(arguments[2], arguments[4], arguments[5]);
else
throw new Error('UNREACHABLE');
}
return ret;
}
function runner(n) {
var n = (n % (-1 >>> 0)) >>> 0;
var b = 4;
while (b < n && b > 0) {
if ((n & b) === b)
n -= b;
b <<= 3;
}
return n;
}
function failWell() { }
console.log(failSafely(null, runner, failWell, Math.random() * 1e15));
var t = process.hrtime();
for (var i = 0; i < ITER; i++) {
failSafely(null, runner, failWell, Math.random() * 1e15);
}
t = process.hrtime(t);
console.log(((t[0] * 1e9 + t[1]) / ITER).toFixed(1) + ' ns/op');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment