https://issues.dlang.org/show_bug.cgi?id=16457
Dmitry Olshansky <[email protected]> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |[email protected] --- Comment #1 from Dmitry Olshansky <[email protected]> --- (In reply to greensunny12 from comment #0) > Consider the following program, it will crash as it allocates _a lot_ of > memory before the garbage can be collected. > > void main() > { > import std.regex; > enum re = ctRegex!(`((c)(s)?)?ti`); > import core.memory : GC; > string text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit"; > > foreach (i; 0..500_000_000) > { > if (auto m = matchAll(text, re)) {} > //if (i % 1_000_000) > //GC.collect(); > } > } > > On my machine (16G) it crashes at about 5M iterations. > The GC profile finds two hotspots (here 2M iterations): > > 2048000000 2000000 uint[] D main > std/regex/internal/parser.d:1607 > 184000000 2000000 std.regex.internal.ir.Bytecode[] D main > std/array.d:852 > > (the latter is insertInPlace) > > After looking at the code it seems pretty weird, because "postprocess" > should be called while constructing the RegEx and once only. The problem is enum re = ... line. Enum means ctRegex!`((c)(s)?)?ti` is copy-pasted at the place of usage, basically reconstructing regex on each loop iteration b/c compile-time version can't cache compiled patterns. Replace enum with static and all should be good. --
