4 ms·
You can switch on arbitrary types in JS and you can add expressions: switch(3) { case true: break; case "ab" + "c": break; case Math.ran
by TAForObvReasons 4y ago
You can switch on arbitrary types in JS and you can add expressions:
switch(3) {
case true: break;
case "ab" + "c": break;
case Math.random() >= 0.5 ? "heads" : new Error("tails") : break;
}
The optimizer will have to be persuaded that the switch and each case is integral before optimizing with a jump table. On the other hand, Arrays typically have a fast path for integer indices.
- teruakohatu 4y agoThat explains it, but shouldn't a switch with string or numerical constants (or an expression made up of constants) just be optimized away anyway?
- jcfields 4y agoThe article quotes a Stack Overflow post with the conditions under which V8 will optimize the switch statement: > @LGB actually in V8 (JS engine used by google chrome) you need to jump through a lot of hoops to get switch case optimized: All the cases must be of same type. All the cases must either be string literals or 31-bit signed integer literals. And there must be less than 128 cases. And even after all those hoops, all you get is what you would have gotten with if-elses anyway (I.E. no jump tables or sth like that). True story. In the case of this emulator, it wasn’t being optimized because it had more than 128 cases.
- teruakohatu 4y ago> In the case of this emulator, it wasn’t being optimized because it had more than 128 cases. Now that makes sense. Thank you.
- shultays 4y agoBut in js you can have maps of arbitrary types as keys right? So jump table could just use that
- mattashii 4y agothat's not quite true, because arbitrary expressions can change meaning due to e.g. overloading of functions. E.g. Random.random() will have to be called each time that case branch is evaluated, because that function could be overloaded or change its returned value.