Hello,
I have an array of array of strings, a 2D table encapsulated in a struct:
The first few rows look like this.
enum TBL_niceExpressionTemplates =
(表([
[q{/+Note: Name+/},q{/+Note: Example+/},q{/+Note: Pattern+/},q{/+Note: op+/},q{/+Note: Style+/},q{/+Note: Syntax+/},q{/+Note: Class+/},q{/+Note: Scripts @init: @text @node @draw @ui+/}],
[q{null_},q{},q{/+Code:+/},q{""},q{dim},q{Whitespace},q{NiceExpression},q{}],
[q{magnitude},q{(magnitude(a))},q{/+Code: (op(expr))+/},q{"magnitude"},q{dim},q{Symbol},q{NiceExpression},q{@text: put(operator); op(0); @node: put('|'); op(0); put('|'); }],
[q{normalize},q{(normalize(a))},q{/+Code: (op(expr))+/},q{"normalize"},q{dim},q{Symbol},q{NiceExpression},q{@text: put(operator); op(0); @node: put('‖'); op(0); put('‖'); }],
...
]));
I have around 50 rows total, not much for a computer.
Then I use the 'table' and try to generate an actual static immutable array of runtime structs.
I use an own makeNiceExpressionTemplate(string[] args) function to convert those table rows into the runtime used structs.
static immutable niceExpressionTemplates = TBL_niceExpressionTemplates.rows.map!makeNiceExpressionTemplate.array;
This method is perfectly fine, it must be under a millisecond, I can't see it in the ftime-trace.
But when I try to put this table together using a string mixin, it goes extremelyi slow:
mixin(iq{static immutable niceExpressionTemplates = [$(TBL_niceExpressionTemplates.rows.map!((r)=>(iq{makeNiceExpressionTemplate($(r.text))}.text)).join(','))]; }.text)
It took 2.6 seconds!!!
It concatenates 50+ strings like this -> makeNiceExpressionTemplate(["null_", "", "/+Code:+/", """", "dim", "Whitespace", "NiceExpression", ""]),
into a single long string.
Put an array declaration 'container' around it, and then gives it to mixin()
Then the weird thing happens:
Even the makeNiceExpressionTemplate() is called with the sampe parameter: a string array, it generates all the code for it again and again.
Exactly that many times as the join() template is executed on it.
I narrowed down the code as much as possible:
static immutable very_slow_operation = TBL_niceExpressionTemplates.rows.map!text.join(',');
It is a combination of text(), join(), and formatting string arrays to text.
My only question is why?
What is the exact thing I should avoid, why join() recompiles their iterations from zero all the time?
Thank You in advance!