Skip to content

Commit 3741586

Browse files
authored
regex-redux implementations (#335)
1 parent b76486f commit 3741586

File tree

4 files changed

+161
-0
lines changed

4 files changed

+161
-0
lines changed

bench/algorithm/regex-redux/1.d

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import std;
2+
import std.outbuffer: OutBuffer;
3+
4+
static immutable s1 = [
5+
tuple(ctRegex!("agggtaaa|tttaccct"), "agggtaaa|tttaccct"),
6+
tuple(ctRegex!("[cgt]gggtaaa|tttaccc[acg]"),"[cgt]gggtaaa|tttaccc[acg]"),
7+
tuple(ctRegex!("a[act]ggtaaa|tttacc[agt]t"),"a[act]ggtaaa|tttacc[agt]t"),
8+
tuple(ctRegex!("ag[act]gtaaa|tttac[agt]ct"),"ag[act]gtaaa|tttac[agt]ct"),
9+
tuple(ctRegex!("agg[act]taaa|ttta[agt]cct"),"agg[act]taaa|ttta[agt]cct"),
10+
tuple(ctRegex!("aggg[acg]aaa|ttt[cgt]ccct"),"aggg[acg]aaa|ttt[cgt]ccct"),
11+
tuple(ctRegex!("agggt[cgt]aa|tt[acg]accct"),"agggt[cgt]aa|tt[acg]accct"),
12+
tuple(ctRegex!("agggta[cgt]a|t[acg]taccct"),"agggta[cgt]a|t[acg]taccct"),
13+
tuple(ctRegex!("agggtaa[cgt]|[acg]ttaccct"),"agggtaa[cgt]|[acg]ttaccct")
14+
];
15+
16+
static immutable s2 = [
17+
ctRegex!("tHa[Nt]"),
18+
ctRegex!("aND|caN|Ha[DS]|WaS"),
19+
ctRegex!("a[NSt]|BY"),
20+
ctRegex!("<[^>]*>"),
21+
ctRegex!("\\|[^|][^|]*\\|"),
22+
];
23+
24+
static immutable s3 = ["<4>","<3>","<2>","|","-"];
25+
26+
void main(string[] args) {
27+
immutable string fileName = args.length > 1 ? args[1] : "25000_in";
28+
auto content = readText(fileName);
29+
auto ilen = content.length;
30+
auto r = regex(">.*\n|\n");
31+
content = replaceAll(content, r, "");
32+
auto clen = content.length;
33+
foreach(re; s1) {
34+
auto m = matchAll(content, re[0]);
35+
writeln(re[1], " ", m.array.length);
36+
}
37+
foreach(i; 0 .. s3.length) {
38+
content = replaceAll(content, s2[i], s3[i]);
39+
}
40+
writefln("\n%d\n%d\n%d",ilen,clen,content.length);
41+
}

bench/algorithm/regex-redux/2.d

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import std;
2+
import std.outbuffer: OutBuffer;
3+
4+
static immutable s1 = [
5+
tuple(ctRegex!("agggtaaa|tttaccct"), "agggtaaa|tttaccct"),
6+
tuple(ctRegex!("[cgt]gggtaaa|tttaccc[acg]"),"[cgt]gggtaaa|tttaccc[acg]"),
7+
tuple(ctRegex!("a[act]ggtaaa|tttacc[agt]t"),"a[act]ggtaaa|tttacc[agt]t"),
8+
tuple(ctRegex!("ag[act]gtaaa|tttac[agt]ct"),"ag[act]gtaaa|tttac[agt]ct"),
9+
tuple(ctRegex!("agg[act]taaa|ttta[agt]cct"),"agg[act]taaa|ttta[agt]cct"),
10+
tuple(ctRegex!("aggg[acg]aaa|ttt[cgt]ccct"),"aggg[acg]aaa|ttt[cgt]ccct"),
11+
tuple(ctRegex!("agggt[cgt]aa|tt[acg]accct"),"agggt[cgt]aa|tt[acg]accct"),
12+
tuple(ctRegex!("agggta[cgt]a|t[acg]taccct"),"agggta[cgt]a|t[acg]taccct"),
13+
tuple(ctRegex!("agggtaa[cgt]|[acg]ttaccct"),"agggtaa[cgt]|[acg]ttaccct")
14+
];
15+
16+
static immutable s2 = [
17+
ctRegex!("tHa[Nt]"),
18+
ctRegex!("aND|caN|Ha[DS]|WaS"),
19+
ctRegex!("a[NSt]|BY"),
20+
ctRegex!("<[^>]*>"),
21+
ctRegex!("\\|[^|][^|]*\\|"),
22+
];
23+
24+
static immutable s3 = ["<4>","<3>","<2>","|","-"];
25+
26+
void main(string[] args) {
27+
immutable string fileName = args.length > 1 ? args[1] : "25000_in";
28+
auto content = readText(fileName);
29+
auto ilen = content.length;
30+
auto r = ctRegex!(">.*\n|\n");
31+
content = replaceAll(content, r, "");
32+
auto clen = content.length;
33+
foreach(re; s1) {
34+
auto m = matchAll(content, re[0]);
35+
writeln(re[1], " ", m.array.length);
36+
}
37+
auto sink = appender!(char [])();
38+
sink.reserve(ilen);
39+
string current;
40+
bool firstRun = true;
41+
foreach(i; 0..s3.length) {
42+
if (firstRun) {
43+
replaceAllInto(sink, content, s2[i], s3[i]);
44+
firstRun = false;
45+
}
46+
else
47+
replaceAllInto(sink, current, s2[i], s3[i]);
48+
current = to!string(sink.data);
49+
if (sink.data.length)
50+
sink.clear();
51+
}
52+
writefln("\n%d\n%d\n%d",ilen,clen,current.length);
53+
}

bench/algorithm/regex-redux/3.d

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import std;
2+
import std.outbuffer: OutBuffer;
3+
4+
static immutable s1 = [
5+
tuple(ctRegex!("agggtaaa|tttaccct"), "agggtaaa|tttaccct"),
6+
tuple(ctRegex!("[cgt]gggtaaa|tttaccc[acg]"),"[cgt]gggtaaa|tttaccc[acg]"),
7+
tuple(ctRegex!("a[act]ggtaaa|tttacc[agt]t"),"a[act]ggtaaa|tttacc[agt]t"),
8+
tuple(ctRegex!("ag[act]gtaaa|tttac[agt]ct"),"ag[act]gtaaa|tttac[agt]ct"),
9+
tuple(ctRegex!("agg[act]taaa|ttta[agt]cct"),"agg[act]taaa|ttta[agt]cct"),
10+
tuple(ctRegex!("aggg[acg]aaa|ttt[cgt]ccct"),"aggg[acg]aaa|ttt[cgt]ccct"),
11+
tuple(ctRegex!("agggt[cgt]aa|tt[acg]accct"),"agggt[cgt]aa|tt[acg]accct"),
12+
tuple(ctRegex!("agggta[cgt]a|t[acg]taccct"),"agggta[cgt]a|t[acg]taccct"),
13+
tuple(ctRegex!("agggtaa[cgt]|[acg]ttaccct"),"agggtaa[cgt]|[acg]ttaccct")
14+
];
15+
16+
static immutable s2 = [
17+
ctRegex!("tHa[Nt]"),
18+
ctRegex!("aND|caN|Ha[DS]|WaS"),
19+
ctRegex!("a[NSt]|BY"),
20+
ctRegex!("<[^>]*>"),
21+
ctRegex!("\\|[^|][^|]*\\|"),
22+
];
23+
24+
static immutable s3 = ["<4>","<3>","<2>","|","-"];
25+
26+
void f1(string content) {
27+
foreach(re; s1) {
28+
auto m = matchAll(content, re[0]);
29+
writeln(re[1], " ", m.array.length);
30+
}
31+
}
32+
33+
long f2(string content) {
34+
auto sink = appender!(char [])();
35+
sink.reserve(content.length);
36+
string current;
37+
bool firstRun = true;
38+
foreach(i; 0..s3.length) {
39+
if (firstRun) {
40+
replaceAllInto(sink, content, s2[i], s3[i]);
41+
firstRun = false;
42+
}
43+
else
44+
replaceAllInto(sink, current, s2[i], s3[i]);
45+
current = to!string(sink.data);
46+
if (sink.data.length)
47+
sink.clear();
48+
}
49+
return current.length;
50+
}
51+
52+
void main(string[] args) {
53+
immutable string fileName = args.length > 1 ? args[1] : "25000_in";
54+
auto content = readText(fileName);
55+
auto ilen = content.length;
56+
auto r = ctRegex!(">.*\n|\n");
57+
content = replaceAll(content, r, "");
58+
auto clen = content.length;
59+
auto task2 = task!f2(content);
60+
task2.executeInNewThread();
61+
f1(content);
62+
auto lengthResult = task2.yieldForce;
63+
writefln("\n%d\n%d\n%d",ilen,clen,lengthResult);
64+
}

bench/bench_d.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ problems:
4141
- name: mandelbrot
4242
source:
4343
- 1.d
44+
- name: regex-redux
45+
source:
46+
- 3.d
4447
compiler_version_command:
4548
compiler_version_regex:
4649
runtime_version_parameter:

0 commit comments

Comments
 (0)