crystal-lang / crystal

The Crystal Programming Language
https://crystal-lang.org
Apache License 2.0
19.2k stars 1.61k forks source link

Implement `ECR.process_string` as a macro #14735

Open HertzDevil opened 1 week ago

HertzDevil commented 1 week ago

This is a proof of concept to show that we don't need the macro run here at all. Whether this macro is indeed faster than the existing src/ecr/process.cr for all use cases is up for investigation, but these are the results of doing make clean clean_cache && time make && rm .build/crystal && time make, rebuilding the compiler with a cold and hot cache respectively, with this PR:

real    0m17.873s
user    0m31.251s
sys     0m2.823s

real    0m14.343s
user    0m14.761s
sys     0m1.097s

and without this PR:

real    0m22.057s
user    0m34.573s
sys     0m3.136s

real    0m15.532s
user    0m16.533s
sys     0m1.388s

I couldn't notice any significant differences when running the files under scripts/ that also use ECR.

The looper* variables are a workaround for not having while in the macro language.

This PR consumes about 120 MB more memory in the compiler itself, but note that there are no more subprocesses doing macro runs. It seems string.chars and those looper elements each contribute roughly 10 MB of memory.