diff --git a/libraries/o-error/doc/benchmark.js b/libraries/o-error/doc/benchmark.js new file mode 100644 index 0000000000..4e1bf2695c --- /dev/null +++ b/libraries/o-error/doc/benchmark.js @@ -0,0 +1,44 @@ +// +// A quick microbenchmark for OError.tag. +// +const OError = require('..') + +function benchmark(fn, repeats = 100000) { + const startTime = process.hrtime() + for (let i = 0; i < repeats; ++i) { + fn() + } + const elapsed = process.hrtime(startTime) + return elapsed[0] * 1e3 + elapsed[1] * 1e-6 +} + +function throwError() { + throw new Error('here is a test error') +} + +console.log( + 'no tagging: ', + benchmark(() => { + try { + throwError() + return 1 + } catch (error) { + return 0 + } + }), + 'ms' +) + +console.log( + 'tagging: ', + benchmark(() => { + try { + throwError() + return 1 + } catch (error) { + OError.tag(error, 'here is a test tag') + return 0 + } + }), + 'ms' +) diff --git a/libraries/o-error/index.js b/libraries/o-error/index.js index 3eadfc83de..fce23de2e0 100644 --- a/libraries/o-error/index.js +++ b/libraries/o-error/index.js @@ -56,8 +56,8 @@ class OError extends Error { let tag if (Error.captureStackTrace) { - // Hide this function in the stack trace. - tag = { name: 'TaggedError', message, info } + // Hide this function in the stack trace, and avoid capturing it twice. + tag = /** @type TaggedError */ ({ name: 'TaggedError', message, info }) Error.captureStackTrace(tag, OError.tag) } else { tag = new TaggedError(message, info)