Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Validator lookup precompilation #63

Open
wants to merge 3 commits into
base: master
Choose a base branch
from

Conversation

jfornoff
Copy link
Collaborator

This adds a precompile_validator_lookup flag (defaulting to false) to
use Vex.Struct.

This changes behavior as follows:

  • a module attribute (@precompiled_validator_lookup) is initialized for the struct that holds a lookup data structure
  • calls to validates :attribute, <validations> proactively look up the
    validator AT COMPILE TIME and add them to the lookup data structure
  • At runtime, the expensive validator lookup is then skipped in favor of just performing a Map fetch from the precompiled
    validator lookup datastructure.

From my benchmarks, this improved performance on a Struct with 9 fields and 5 distinct validators from 2.25k IPS to 11.3k IPS (+361% performance).

This adds a `precompile_validator_lookup` flag (defaulting to false) to
`use Vex.Struct`.

This changes behavior as follows:
* a module attribute (@precompiled_validator_lookup) is initialized for the struct that holds a lookup data structure
* calls to `validates :attribute, <validations>` proactively look up the
validator AT COMPILE TIME and add them to the lookup data structure
* At runtime, the expensive validator lookup is then skipped in favor of just performing a Map fetch from the precompiled
validator lookup datastructure.
It is allowed to state `validates :attribute, &myfunction/1`.
This special case is expanded to `validates :attribute, by:
&myfunction/1` during the validation at runtime.

Therefore, we need to cache the `:by` validator if we encounter a
function.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant