Benchmark : String templating at runtime

Hi all,

I am facing the issue of having large template strings containing an unknown number of variables, and those templates need to be bound thousands of times.
Due to performance constraints, I would like for this procedure to be optimized. I had multiple ways of doing it.

Threads such as this one suggest to use EEx. I saw that I could use EEx.compile_string to get a quoted expression, that I can resolve with Code.eval_quoted (on the benchmark : eex). I also benchmarked a direct call to EEx.eval_string (eex_eval_string).

The previous implementation of this was to simply parse the content of the string for each variable, using a Regex. I added that method to the benchmark (base).

I also tried a manual implementation. The template is parsed once, and broken down into parts. During the binding, I simply append each variable value and each part (manual).

You can see the implementation here, the benchmark here and the results here.

Conclusions :

  • Manual implementation outperforms the rest, by a wide margin.
  • EEx seriously underperforms for this task (40x-170x slower than manual). Maybe I’m not using it right.
  • Creating this benchmark was incredibly simple. Kudos to Benchee.

Please do not hesitate if you have feedback, or if you’d like to add another method to the test.

1 Like