Synchronous try/catch vs. instanceof/return
JavaScript performance comparison
Info
This is a test between two common design patterns for synchronous code - either having the block of code throw an Error, or having the Error object be returned as a value and having it's type checked with instanceof. I am testing to see if throwing has as much overhead as value parsing, and if throwing is susceptible to bubbling.
Preparation code
<script>
Benchmark.prototype.setup = function() {
var console = console ? console : { "log": function() {} };
function tryCatchRecurse(loops) {
if (loops >= 0) {
tryCatchRecurse(--loops);
} else {
throw new Error("Try / Catch Recursion Finished");
}
}
function instanceofReturnRecurse(loops) {
if (loops >= 0) {
instanceofReturnRecurse(--loops);
} else {
return new Error("Instanceof / Return Recursion Finished");
}
}
function valueEqualityReturnRecurse(loops) {
if (loops >= 0) {
valueEqualityReturnRecurse(--loops);
} else {
return 0;
}
}
function tryCatchNamedOne() {
throw new Error("Named Try / Catch Functions Finished");
}
function tryCatchNamedTwo() {
tryCatchNamedOne();
}
function tryCatchNamedThree() {
tryCatchNamedTwo();
}
function tryCatchNamedFour() {
tryCatchNamedThree();
}
function tryCatchNamedFive() {
tryCatchNamedFour();
}
function tryCatchNamedSix() {
tryCatchNamedFive();
}
function tryCatchNamedSeven() {
tryCatchNamedSix();
}
function tryCatchNamedEight() {
tryCatchNamedSeven();
}
function tryCatchNamedNine() {
tryCatchNamedEight();
}
function tryCatchNamedTen() {
tryCatchNamedNine();
}
function instanceofReturnNamedOne() {
return new Error("Named Try / Catch Functions Finished");
}
function instanceofReturnNamedTwo() {
return instanceofReturnNamedOne();
}
function instanceofReturnNamedThree() {
return instanceofReturnNamedTwo();
}
function instanceofReturnNamedFour() {
return instanceofReturnNamedThree();
}
function instanceofReturnNamedFive() {
return instanceofReturnNamedFour();
}
function instanceofReturnNamedSix() {
return instanceofReturnNamedFive();
}
function instanceofReturnNamedSeven() {
return instanceofReturnNamedSix();
}
function instanceofReturnNamedEight() {
return instanceofReturnNamedSeven();
}
function instanceofReturnNamedNine() {
return instanceofReturnNamedEight();
}
function instanceofReturnNamedTen() {
return instanceofReturnNamedNine();
}
function valueEqualityReturnNamedOne() {
return new Error("Named Try / Catch Functions Finished");
}
function valueEqualityReturnNamedTwo() {
return valueEqualityReturnNamedOne();
}
function valueEqualityReturnNamedThree() {
return valueEqualityReturnNamedTwo();
}
function valueEqualityReturnNamedFour() {
return valueEqualityReturnNamedThree();
}
function valueEqualityReturnNamedFive() {
return valueEqualityReturnNamedFour();
}
function valueEqualityReturnNamedSix() {
return valueEqualityReturnNamedFive();
}
function valueEqualityReturnNamedSeven() {
return valueEqualityReturnNamedSix();
}
function valueEqualityReturnNamedEight() {
return valueEqualityReturnNamedSeven();
}
function valueEqualityReturnNamedNine() {
return valueEqualityReturnNamedEight();
}
function valueEqualityReturnNamedTen() {
return valueEqualityReturnNamedNine();
}
};
</script>
Test runner
Warning! For accurate results, please disable Firebug before running the tests. (Why?)
Java applet disabled.
| Test | Ops/sec | |
|---|---|---|
Recursive Try/Catch Block 1 |
|
pending… |
Recursive Try/Catch Block 2 |
|
pending… |
Recursive Try/Catch Block 3 |
|
pending… |
Recursive Try/Catch Block 4 |
|
pending… |
Recursive Try/Catch Block 5 |
|
pending… |
Recursive Try/Catch Block 6 |
|
pending… |
Recursive Try/Catch Block 7 |
|
pending… |
Recursive Try/Catch Block 8 |
|
pending… |
Recursive Try/Catch Block 9 |
|
pending… |
Recursive Try/Catch Block 10 |
|
pending… |
Recursive Instanceof/Return Block 1 |
|
pending… |
Recursive Instanceof/Return Block 2 |
|
pending… |
Recursive Instanceof/Return Block 3 |
|
pending… |
Recursive Instanceof/Return Block 4 |
|
pending… |
Recursive Instanceof/Return Block 5 |
|
pending… |
Recursive Instanceof/Return Block 6 |
|
pending… |
Recursive Instanceof/Return Block 7 |
|
pending… |
Recursive Instanceof/Return Block 8 |
|
pending… |
Recursive Instanceof/Return Block 9 |
|
pending… |
Recursive Instanceof/Return Block 10 |
|
pending… |
Recursive Value Equality/Return Block 1 |
|
pending… |
Recursive Value Equality/Return Block 2 |
|
pending… |
Recursive Value Equality/Return Block 3 |
|
pending… |
Recursive Value Equality/Return Block 4 |
|
pending… |
Recursive Value Equality/Return Block 5 |
|
pending… |
Recursive Value Equality/Return Block 6 |
|
pending… |
Recursive Value Equality/Return Block 7 |
|
pending… |
Recursive Value Equality/Return Block 8 |
|
pending… |
Recursive Value Equality/Return Block 9 |
|
pending… |
Recursive Value Equality/Return Block 10 |
|
pending… |
Named Function Try/Catch Block 1 |
|
pending… |
Named Function Try/Catch Block 2 |
|
pending… |
Named Function Try/Catch Block 3 |
|
pending… |
Named Function Try/Catch Block 4 |
|
pending… |
Named Function Try/Catch Block 5 |
|
pending… |
Named Function Try/Catch Block 6 |
|
pending… |
Named Function Try/Catch Block 7 |
|
pending… |
Named Function Try/Catch Block 8 |
|
pending… |
Named Function Try/Catch Block 9 |
|
pending… |
Named Function Try/Catch Block 10 |
|
pending… |
Named Function Instanceof/Return Block 1 |
|
pending… |
Named Function Instanceof/Return Block 2 |
|
pending… |
Named Function Instanceof/Return Block 3 |
|
pending… |
Named Function Instanceof/Return Block 4 |
|
pending… |
Named Function Instanceof/Return Block 5 |
|
pending… |
Named Function Instanceof/Return Block 6 |
|
pending… |
Named Function Instanceof/Return Block 7 |
|
pending… |
Named Function Instanceof/Return Block 8 |
|
pending… |
Named Function Instanceof/Return Block 9 |
|
pending… |
Named Function Instanceof/Return Block 10 |
|
pending… |
Named Function Value Equality/Return Block 1 |
|
pending… |
Named Function Value Equality/Return Block 2 |
|
pending… |
Named Function Value Equality/Return Block 3 |
|
pending… |
Named Function Value Equality/Return Block 4 |
|
pending… |
Named Function Value Equality/Return Block 5 |
|
pending… |
Named Function Value Equality/Return Block 6 |
|
pending… |
Named Function Value Equality/Return Block 7 |
|
pending… |
Named Function Value Equality/Return Block 8 |
|
pending… |
Named Function Value Equality/Return Block 9 |
|
pending… |
Named Function Value Equality/Return Block 10 |
|
pending… |
Anonymous Function Try/Catch Block 1 |
|
pending… |
Anonymous Function Try/Catch Block 2 |
|
pending… |
Anonymous Function Try/Catch Block 3 |
|
pending… |
Anonymous Function Try/Catch Block 4 |
|
pending… |
Anonymous Function Try/Catch Block 5 |
|
pending… |
Anonymous Function Try/Catch Block 6 |
|
pending… |
Anonymous Function Try/Catch Block 7 |
|
pending… |
Anonymous Function Try/Catch Block 8 |
|
pending… |
Anonymous Function Try/Catch Block 9 |
|
pending… |
Anonymous Function Try/Catch Block 10 |
|
pending… |
Anonymous Function Instanceof/Return Block 1 |
|
pending… |
Anonymous Function Instanceof/Return Block 2 |
|
pending… |
Anonymous Function Instanceof/Return Block 3 |
|
pending… |
Anonymous Function Instanceof/Return Block 4 |
|
pending… |
Anonymous Function Instanceof/Return Block 5 |
|
pending… |
Anonymous Function Instanceof/Return Block 6 |
|
pending… |
Anonymous Function Instanceof/Return Block 7 |
|
pending… |
Anonymous Function Instanceof/Return Block 8 |
|
pending… |
Anonymous Function Instanceof/Return Block 9 |
|
pending… |
Anonymous Function Instanceof/Return Block 10 |
|
pending… |
Compare results of other browsers
Revisions
You can edit these tests or add even more tests to this page by appending /edit to the URL. Here’s a list of current revisions for this page:
- Revision 1: published by Athan Clark
- Revision 2: published
0 comments