I'm developing a new version of my parser library (https://parjs.org/), so
I'm writing kind of low-level CPU-bound code.
It's a parser combinator library, so parsers are composed of building
blocks and combinators that work like a tree. Each combinator "class" has
different logic and properties.
However, their external interface is the same, with a single `parse` method
that applies whatever logic the class has.
A combinator like "many" can potentially apply any parser repeatedly, and
so different instances will have different parser inputs. For example, you
can have:
- new Many(new Digit()) parses multiple digits
- new Many(new String("abc")) parses multiple literals "abc"
- new Many(new Letter()) parses multiple letters
Inside the code of `Many`, you'd have a call like `child.parse(input)`
In the previous version, profiling and diagnostics revealed that
performance was dominated by function call overhead, and almost all the
method calls turned out to be megamorphic because when `child.parse` was
called in the same location, `child` was a different type of object.
In this new version, I'm trying to figure out if it's possible to avoid
that. My idea is to pass around functions instead of objects with methods.
By doing this, I'm hoping that method resolution can be avoided, and that
the code won't need to be megamorphic because all the objects are
sufficiently similar.
These functions still need internal parameters, which includes input parser
objects.
- The nicest idea is to use closures.
- But another solution could be doing something like
`parser.parse.bind(parser)` and passing that around.
Will something like this allow me to avoid megamorphism? Is there something
else I can do?
--
--
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users
---
You received this message because you are subscribed to the Google Groups
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/v8-users/2ad07d6a-29f9-477b-8ffa-89cf446c4ff3n%40googlegroups.com.