Skip to content

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