Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Turning Sieve benchmarks into Enso benchmarks #8475

Merged
merged 6 commits into from
Dec 8, 2023
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ private void generateClassForGroup(
" throw new IllegalStateException(\"Project root directory does not exist or cannot be read: \" + Objects.toString(projectRootDir));");
out.println(" }");
out.println(" File languageHomeOverride = Utils.findLanguageHomeOverride();");
out.println(" var ctx = Context.newBuilder(LanguageInfo.ID)");
out.println(" var ctx = Context.newBuilder()");
Copy link
Member Author

@JaroslavTulach JaroslavTulach Dec 6, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I thought it was going to be a classpath issue, not "restricted to Enso language" issue! Thank you for your help, @Akirathan!

out.println(" .allowExperimentalOptions(true)");
out.println(" .allowIO(IOAccess.ALL)");
out.println(" .allowAllAccess(true)");
Expand Down
56 changes: 56 additions & 0 deletions test/Benchmarks/data/sieve.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
function Natural() {
this.x = 2;
};
Natural.prototype.next = function() {
return this.x++;
};

function Filter(number) {
this.number = number;
this.next = null;
this.last = this;
}
Filter.prototype.acceptAndAdd = function(n) {
var filter = this;
var sqrt = Math.sqrt(n);
for (;;) {
if (n % filter.number === 0) {
return false;
}
if (filter.number > sqrt) {
break;
}
filter = filter.next;
}
var newFilter = new Filter(n);
this.last.next = newFilter;
this.last = newFilter;
return true;
};

function Primes(natural) {
this.natural = natural;
this.filter = null;
}
Primes.prototype.next = function() {
for (;;) {
var n = this.natural.next();
if (this.filter === null) {
this.filter = new Filter(n);
return n;
}
if (this.filter.acceptAndAdd(n)) {
return n;
}
}
};

function globalPrimes(upto) {
var primes = new Primes(new Natural());
for (var cnt = 1;; cnt++) {
res = primes.next();
if (cnt >= upto) {
return res;
}
}
}
2 changes: 2 additions & 0 deletions test/Benchmarks/src/Main.enso
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import project.Natural_Order_Sort
import project.Number_Parse
import project.Numeric
import project.Range
import project.Sieve
import project.Sum
import project.Startup.Startup
import project.Runtime.Panics_And_Errors
Expand Down Expand Up @@ -86,6 +87,7 @@ all_benchmarks =
builder.append Panics_And_Errors.collect_benches

builder.append Startup.collect_benches
builder.append Sieve.Main.collect_benches

builder.to_vector

Expand Down
35 changes: 35 additions & 0 deletions test/Benchmarks/src/Sieve/Main.enso
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from Standard.Base import all

from Standard.Test import Bench

import project.Sieve.Sieve_Original
import project.Sieve.Sieve_Ascribed
import project.Sieve.Sieve_Without_Types
import project.Sieve.Sieve_Java_Script

# execute as
# sbt:enso> runEngineDistribution --run test/Benchmarks Sieve
# or as
# sbt:enso> std-benchmarks/benchOnly Sieve

options = Bench.options . set_warmup (Bench.phase_conf 3 5) . set_measure (Bench.phase_conf 3 3)

collect_benches = Bench.build builder->
assert_prime nth =
if nth==1299709 . not then Panic.throw "Wrong prime number: "+nth.to_text

builder.group "Sieve" options group_builder->
group_builder.specify "Original" <|
assert_prime <| Sieve_Original.compute_nth_prime 100000
group_builder.specify "Ascribed" <|
assert_prime <| Sieve_Ascribed.compute_nth_prime 100000
group_builder.specify "Without_Types" <|
assert_prime <| Sieve_Without_Types.compute_nth_prime 100000
group_builder.specify "Java_Script_File" <|
assert_prime <| Sieve_Java_Script.compute_nth_prime_from_js_file 100000
group_builder.specify "Java_Script_All" <|
assert_prime <| Sieve_Java_Script.all_in_java_script 100000
group_builder.specify "Java_Script_Natural" <|
assert_prime <| Sieve_Java_Script.compute_nth_prime_natural_in_js 100000
group_builder.specify "Java_Script_Filter" <|
assert_prime <| Sieve_Java_Script.compute_nth_prime_filter_in_js 100000
129 changes: 129 additions & 0 deletions test/Benchmarks/src/Sieve/Sieve_Java_Script.enso
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
from Standard.Base import all

import project.Sieve.Sieve_Without_Types

foreign js natural_in_js = """
class Gen {
constructor() {
this.n = 2
}

n() {
return this.n
}

next() {
this.n++
return this
}
}
return new Gen()

compute_nth_prime_natural_in_js = Sieve_Without_Types.compute_nth_prime gen=natural_in_js
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These JavaScript benchmarks work with:

sbt:enso> runEngineDistribution --run test/Benchmarks Sieve

but not with std-benchmarks/benchOnly Sieve. Please help, @Akirathan!


foreign js filter_in_js = """
function Filter(number) {
this.number = number;
this.next = null;
this.last = this;
}
Filter.prototype.acceptAndAdd = function(n) {
var filter = this;
var sqrt = Math.sqrt(n);
while (filter != null) {
if (filter.number) {
if (n % filter.number === 0) {
return null;
}
if (filter.number > sqrt) {
break;
}
}
filter = filter.next;
}
var newFilter = new Filter(n);
this.last.next = newFilter;
this.last = newFilter;
return this;
};
return new Filter(null);

compute_nth_prime_filter_in_js = Sieve_Without_Types.compute_nth_prime fil=filter_in_js

compute_nth_prime_from_js_file n =
script = enso_project.data/"sieve.js"
bench_external_file script.to_text n

foreign js bench_external_file script n = """
if (!globalThis.globalPrimes) {
Polyglot.evalFile("js", script.toString());
}
return globalPrimes(n);

type Primes
Alg generator filter

Primes.next self = case self of
Primes.Alg g f ->
filter = f.acceptAndAdd g.n
new_primes = Primes.Alg g.next filter
if Meta.is_same_object filter f then @Tail_Call new_primes.next else new_primes

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

foreign js all_in_java_script n = """
function Natural() {
this.x = 2;
};
Natural.prototype.next = function() {
return this.x++;
};

function Filter(number) {
this.number = number;
this.next = null;
this.last = this;
}
Filter.prototype.acceptAndAdd = function(n) {
var filter = this;
var sqrt = Math.sqrt(n);
for (;;) {
if (n % filter.number === 0) {
return false;
}
if (filter.number > sqrt) {
break;
}
filter = filter.next;
}
var newFilter = new Filter(n);
this.last.next = newFilter;
this.last = newFilter;
return true;
};

function Primes(natural) {
this.natural = natural;
this.filter = null;
}
Primes.prototype.next = function() {
for (;;) {
var n = this.natural.next();
if (this.filter === null) {
this.filter = new Filter(n);
return n;
}
if (this.filter.acceptAndAdd(n)) {
return n;
}
}
};

var res = -1;
let primes = new Primes(new Natural());
for (let i = 0; i < n; i++) {
res = primes.next();
}
return res;

Original file line number Diff line number Diff line change
Expand Up @@ -38,16 +38,17 @@ type Primes
Primes.next self = case self of
Primes.Alg g f ->
filter = f.acceptAndAdd g.n
new_primes = Primes.Alg g.next filter
if Meta.is_same_object filter f then @Tail_Call new_primes.next else new_primes
nf = if filter.is_nothing then f else filter
new_primes = Primes.Alg g.next nf
if filter.is_nothing || Meta.is_same_object filter f then @Tail_Call new_primes.next else new_primes

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


compute_nth_prime n =
compute_nth_prime n gen=natural fil=Filter.Empty =
loop p n = if n == 0 then p else
pn = p.next
@Tail_Call loop pn n-1
p = Primes.Alg natural Filter.Empty
p = Primes.Alg gen fil
loop p n . last_prime
Loading