Skip to content

Commit e4b2b56

Browse files
Turning Sieve benchmarks into Enso benchmarks (#8475)
1 parent a14ebd6 commit e4b2b56

File tree

9 files changed

+228
-87
lines changed

9 files changed

+228
-87
lines changed

engine/runtime/src/bench/java/org/enso/interpreter/bench/benchmarks/semantic/SieveBenchmarks.java

-82
This file was deleted.

lib/scala/bench-processor/src/main/java/org/enso/benchmarks/processor/BenchProcessor.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ private void generateClassForGroup(
231231
" throw new IllegalStateException(\"Project root directory does not exist or cannot be read: \" + Objects.toString(projectRootDir));");
232232
out.println(" }");
233233
out.println(" File languageHomeOverride = Utils.findLanguageHomeOverride();");
234-
out.println(" var ctx = Context.newBuilder(LanguageInfo.ID)");
234+
out.println(" var ctx = Context.newBuilder()");
235235
out.println(" .allowExperimentalOptions(true)");
236236
out.println(" .allowIO(IOAccess.ALL)");
237237
out.println(" .allowAllAccess(true)");

test/Benchmarks/data/sieve.js

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
function Natural() {
2+
this.x = 2;
3+
};
4+
Natural.prototype.next = function() {
5+
return this.x++;
6+
};
7+
8+
function Filter(number) {
9+
this.number = number;
10+
this.next = null;
11+
this.last = this;
12+
}
13+
Filter.prototype.acceptAndAdd = function(n) {
14+
var filter = this;
15+
var sqrt = Math.sqrt(n);
16+
for (;;) {
17+
if (n % filter.number === 0) {
18+
return false;
19+
}
20+
if (filter.number > sqrt) {
21+
break;
22+
}
23+
filter = filter.next;
24+
}
25+
var newFilter = new Filter(n);
26+
this.last.next = newFilter;
27+
this.last = newFilter;
28+
return true;
29+
};
30+
31+
function Primes(natural) {
32+
this.natural = natural;
33+
this.filter = null;
34+
}
35+
Primes.prototype.next = function() {
36+
for (;;) {
37+
var n = this.natural.next();
38+
if (this.filter === null) {
39+
this.filter = new Filter(n);
40+
return n;
41+
}
42+
if (this.filter.acceptAndAdd(n)) {
43+
return n;
44+
}
45+
}
46+
};
47+
48+
function globalPrimes(upto) {
49+
var primes = new Primes(new Natural());
50+
for (var cnt = 1;; cnt++) {
51+
res = primes.next();
52+
if (cnt >= upto) {
53+
return res;
54+
}
55+
}
56+
}

test/Benchmarks/src/Main.enso

+2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import project.Natural_Order_Sort
2929
import project.Number_Parse
3030
import project.Numeric
3131
import project.Range
32+
import project.Sieve
3233
import project.Sum
3334
import project.Startup.Startup
3435
import project.Runtime.Panics_And_Errors
@@ -86,6 +87,7 @@ all_benchmarks =
8687
builder.append Panics_And_Errors.collect_benches
8788

8889
builder.append Startup.collect_benches
90+
builder.append Sieve.Main.collect_benches
8991

9092
builder.to_vector
9193

test/Benchmarks/src/Sieve/Main.enso

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from Standard.Base import all
2+
3+
from Standard.Test import Bench
4+
5+
import project.Sieve.Sieve_Original
6+
import project.Sieve.Sieve_Ascribed
7+
import project.Sieve.Sieve_Without_Types
8+
import project.Sieve.Sieve_Java_Script
9+
10+
# execute as
11+
# sbt:enso> runEngineDistribution --run test/Benchmarks Sieve
12+
# or as
13+
# sbt:enso> std-benchmarks/benchOnly Sieve
14+
15+
options = Bench.options . set_warmup (Bench.phase_conf 3 5) . set_measure (Bench.phase_conf 3 3)
16+
17+
collect_benches = Bench.build builder->
18+
assert_prime nth =
19+
if nth==1299709 . not then Panic.throw "Wrong prime number: "+nth.to_text
20+
21+
builder.group "Sieve" options group_builder->
22+
group_builder.specify "Original" <|
23+
assert_prime <| Sieve_Original.compute_nth_prime 100000
24+
group_builder.specify "Ascribed" <|
25+
assert_prime <| Sieve_Ascribed.compute_nth_prime 100000
26+
group_builder.specify "Without_Types" <|
27+
assert_prime <| Sieve_Without_Types.compute_nth_prime 100000
28+
group_builder.specify "Java_Script_File" <|
29+
assert_prime <| Sieve_Java_Script.compute_nth_prime_from_js_file 100000
30+
group_builder.specify "Java_Script_All" <|
31+
assert_prime <| Sieve_Java_Script.all_in_java_script 100000
32+
group_builder.specify "Java_Script_Natural" <|
33+
assert_prime <| Sieve_Java_Script.compute_nth_prime_natural_in_js 100000
34+
group_builder.specify "Java_Script_Filter" <|
35+
assert_prime <| Sieve_Java_Script.compute_nth_prime_filter_in_js 100000
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
from Standard.Base import all
2+
3+
import project.Sieve.Sieve_Without_Types
4+
5+
foreign js natural_in_js = """
6+
class Gen {
7+
constructor() {
8+
this.n = 2
9+
}
10+
11+
n() {
12+
return this.n
13+
}
14+
15+
next() {
16+
this.n++
17+
return this
18+
}
19+
}
20+
return new Gen()
21+
22+
compute_nth_prime_natural_in_js = Sieve_Without_Types.compute_nth_prime gen=natural_in_js
23+
24+
foreign js filter_in_js = """
25+
function Filter(number) {
26+
this.number = number;
27+
this.next = null;
28+
this.last = this;
29+
}
30+
Filter.prototype.acceptAndAdd = function(n) {
31+
var filter = this;
32+
var sqrt = Math.sqrt(n);
33+
while (filter != null) {
34+
if (filter.number) {
35+
if (n % filter.number === 0) {
36+
return null;
37+
}
38+
if (filter.number > sqrt) {
39+
break;
40+
}
41+
}
42+
filter = filter.next;
43+
}
44+
var newFilter = new Filter(n);
45+
this.last.next = newFilter;
46+
this.last = newFilter;
47+
return this;
48+
};
49+
return new Filter(null);
50+
51+
compute_nth_prime_filter_in_js = Sieve_Without_Types.compute_nth_prime fil=filter_in_js
52+
53+
compute_nth_prime_from_js_file n =
54+
script = enso_project.data/"sieve.js"
55+
bench_external_file script.to_text n
56+
57+
foreign js bench_external_file script n = """
58+
if (!globalThis.globalPrimes) {
59+
Polyglot.evalFile("js", script.toString());
60+
}
61+
return globalPrimes(n);
62+
63+
type Primes
64+
Alg generator filter
65+
66+
Primes.next self = case self of
67+
Primes.Alg g f ->
68+
filter = f.acceptAndAdd g.n
69+
new_primes = Primes.Alg g.next filter
70+
if Meta.is_same_object filter f then @Tail_Call new_primes.next else new_primes
71+
72+
Primes.last_prime self = case self of
73+
Primes.Alg g _ -> g.n - 1
74+
75+
foreign js all_in_java_script n = """
76+
function Natural() {
77+
this.x = 2;
78+
};
79+
Natural.prototype.next = function() {
80+
return this.x++;
81+
};
82+
83+
function Filter(number) {
84+
this.number = number;
85+
this.next = null;
86+
this.last = this;
87+
}
88+
Filter.prototype.acceptAndAdd = function(n) {
89+
var filter = this;
90+
var sqrt = Math.sqrt(n);
91+
for (;;) {
92+
if (n % filter.number === 0) {
93+
return false;
94+
}
95+
if (filter.number > sqrt) {
96+
break;
97+
}
98+
filter = filter.next;
99+
}
100+
var newFilter = new Filter(n);
101+
this.last.next = newFilter;
102+
this.last = newFilter;
103+
return true;
104+
};
105+
106+
function Primes(natural) {
107+
this.natural = natural;
108+
this.filter = null;
109+
}
110+
Primes.prototype.next = function() {
111+
for (;;) {
112+
var n = this.natural.next();
113+
if (this.filter === null) {
114+
this.filter = new Filter(n);
115+
return n;
116+
}
117+
if (this.filter.acceptAndAdd(n)) {
118+
return n;
119+
}
120+
}
121+
};
122+
123+
var res = -1;
124+
let primes = new Primes(new Natural());
125+
for (let i = 0; i < n; i++) {
126+
res = primes.next();
127+
}
128+
return res;
129+
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,17 @@ type Primes
3838
Primes.next self = case self of
3939
Primes.Alg g f ->
4040
filter = f.acceptAndAdd g.n
41-
new_primes = Primes.Alg g.next filter
42-
if Meta.is_same_object filter f then @Tail_Call new_primes.next else new_primes
41+
nf = if filter.is_nothing then f else filter
42+
new_primes = Primes.Alg g.next nf
43+
if filter.is_nothing || Meta.is_same_object filter f then @Tail_Call new_primes.next else new_primes
4344

4445
Primes.last_prime self = case self of
4546
Primes.Alg g _ -> g.n - 1
4647

4748

48-
compute_nth_prime n =
49+
compute_nth_prime n gen=natural fil=Filter.Empty =
4950
loop p n = if n == 0 then p else
5051
pn = p.next
5152
@Tail_Call loop pn n-1
52-
p = Primes.Alg natural Filter.Empty
53+
p = Primes.Alg gen fil
5354
loop p n . last_prime

0 commit comments

Comments
 (0)