D Core Guidelines?
Adam D Ruppe
destructionator at gmail.com
Sun Sep 3 12:10:10 UTC 2023
On Sunday, 3 September 2023 at 05:52:12 UTC, Walter Bright wrote:
> String concatenation tends to be highly useful in CTFE code,
> and runtime performance considerations don't exist.
Well, it depends there too since CTFE string concat has
absolutely terrible performance if you do a lot of it.
A small x ~ y in CTFE is virtually invisible, I'd be fine with
that. But a loop of string ~= thing in ctfe quickly becomes a
compile time killer - it is at least quadratic time.
Redoing that as a single pre-allocated char[] that is slice
assigned can take very noticeable times off builds. For example,
my jsvar.d used to have one that ballooned builds to about 6
seconds. I rewrote it with a length calculation loop, single
allocation, slice assign loop instead of a ~= loop, and it
brought it back down to 2 seconds. (Still a bit slow, but
obviously 2 is much faster than 6.)
Or my jni.d when running over android, it used to use a CTFE
string.replace and it took *minutes* to compile along with dozens
of gigabytes of ram. Prerunning that, so it was just two
separate string literals (yes, this ctfe use only ended up in two
permutations when all was said and done) brought that back to the
land of reality too.
So CTFE concat I almost think is *more* dangerous than runtime
concat. At least the runtime concat has *consistently* decent
performance.
That said tho, anybody reading this, if your strings are short,
CTFE concat works perfectly well. Don't overcomplicate code
unless the strings are long and there's an append loop, then you
MIGHT notice the difference.
More information about the Digitalmars-d
mailing list