Created
May 13, 2015 17:10
-
-
Save trevnorris/b475bf806cd72f9da9a6 to your computer and use it in GitHub Desktop.
Observe the performance difference between finally and catch
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| '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