Add nqueens benchmark (new kraken impl, with koka and cpp moved over from koka_bench)
This commit is contained in:
@@ -2,7 +2,7 @@ set(CMAKE_CXX_STANDARD 17)
|
|||||||
set(CMAKE_CXX_STANDARD_REQUIRED YES)
|
set(CMAKE_CXX_STANDARD_REQUIRED YES)
|
||||||
set(CMAKE_CXX_EXTENSIONS NO)
|
set(CMAKE_CXX_EXTENSIONS NO)
|
||||||
|
|
||||||
foreach (source IN ITEMS rbtree.cpp)
|
foreach (source IN ITEMS rbtree.cpp nqueens.cpp)
|
||||||
get_filename_component(name "${source}" NAME_WE)
|
get_filename_component(name "${source}" NAME_WE)
|
||||||
set(name "cpp-${name}")
|
set(name "cpp-${name}")
|
||||||
|
|
||||||
|
|||||||
94
koka_bench/cpp/nqueens.cpp
Normal file
94
koka_bench/cpp/nqueens.cpp
Normal file
@@ -0,0 +1,94 @@
|
|||||||
|
// NQueens solution in C++
|
||||||
|
// Note: does not free memory as that is difficult to do
|
||||||
|
// since many subsolutions are shared
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class list {
|
||||||
|
public:
|
||||||
|
T head;
|
||||||
|
list<T>* tail;
|
||||||
|
list(T hd, list<T>* tl) {
|
||||||
|
head = hd;
|
||||||
|
tail = tl;
|
||||||
|
}
|
||||||
|
~list() {
|
||||||
|
delete head;
|
||||||
|
delete tail;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
list<T>* Cons( T hd, list<T>* tl ) {
|
||||||
|
return new list<T>(hd,tl);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
int len(list<T>* xs) {
|
||||||
|
int n = 0;
|
||||||
|
while(xs != NULL) {
|
||||||
|
n++;
|
||||||
|
xs = xs->tail;
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool safe( int queen, list<int>* xs ) {
|
||||||
|
list<int>* cur = xs;
|
||||||
|
int diag = 1;
|
||||||
|
while(cur != NULL) {
|
||||||
|
int q = cur->head;
|
||||||
|
if (queen == q || queen == (q+diag) || queen == (q-diag)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
diag++;
|
||||||
|
cur = cur->tail;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
list<list<int>*>* append_safe( int k, list<int>* soln, list<list<int>*>* solns ) {
|
||||||
|
list<list<int>*>* acc = solns;
|
||||||
|
int n = k;
|
||||||
|
while(n > 0) {
|
||||||
|
if (safe(n,soln)) {
|
||||||
|
acc = Cons(Cons(n,soln),acc);
|
||||||
|
}
|
||||||
|
n--;
|
||||||
|
}
|
||||||
|
return acc;
|
||||||
|
}
|
||||||
|
|
||||||
|
list<list<int>*>* extend( int n, list<list<int>*>* solns ) {
|
||||||
|
list<list<int>*>* acc = NULL;
|
||||||
|
list<list<int>*>* cur = solns;
|
||||||
|
while(cur != NULL) {
|
||||||
|
list<int>* soln = cur->head;
|
||||||
|
acc = append_safe(n,soln,acc);
|
||||||
|
cur = cur->tail;
|
||||||
|
}
|
||||||
|
return acc;
|
||||||
|
}
|
||||||
|
|
||||||
|
list<list<int>*>* find_solutions( int n ) {
|
||||||
|
int k = 0;
|
||||||
|
list<list<int>*>* acc = Cons<list<int>*>(NULL,NULL);
|
||||||
|
while(k < n) {
|
||||||
|
acc = extend(n,acc);
|
||||||
|
k++;
|
||||||
|
}
|
||||||
|
return acc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int nqueens(int n) {
|
||||||
|
return len(find_solutions(n));
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char ** argv) {
|
||||||
|
int n = 13;
|
||||||
|
if (argc == 2) {
|
||||||
|
n = atoi(argv[1]);
|
||||||
|
}
|
||||||
|
std::cout << nqueens(n) << "\n";
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
set(sources rbtree.kk)
|
set(sources rbtree.kk nqueens.kk nqueens-int.kk)
|
||||||
|
|
||||||
set(koka koka)
|
set(koka koka)
|
||||||
|
|
||||||
|
|||||||
31
koka_bench/koka/nqueens-int.kk
Normal file
31
koka_bench/koka/nqueens-int.kk
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
module nqueens-int
|
||||||
|
import std/os/env
|
||||||
|
|
||||||
|
alias solution = list<int>
|
||||||
|
alias solutions = list<list<int>>
|
||||||
|
|
||||||
|
fun safe( queen : int, diag : int, ^xs : solution ) : bool
|
||||||
|
match xs
|
||||||
|
Cons(q,qs) -> (queen != q && queen != q + diag && queen != q - diag && safe(queen,diag + 1,qs))
|
||||||
|
_ -> True
|
||||||
|
|
||||||
|
fun append-safe( queen : int, xs : solution, xss : solutions ) : div solutions
|
||||||
|
if queen <= 0 then xss
|
||||||
|
elif safe(queen,1,xs) then append-safe( queen - 1, xs, Cons(Cons(queen,xs),xss) )
|
||||||
|
else append-safe( queen - 1, xs, xss )
|
||||||
|
|
||||||
|
fun extend(queen : int, acc : solutions, xss : solutions ) : div solutions
|
||||||
|
match xss
|
||||||
|
Cons(xs,rest) -> extend(queen, append-safe(queen,xs,acc), rest)
|
||||||
|
Nil -> acc
|
||||||
|
|
||||||
|
fun find-solutions( n : int, queen : int ) : div solutions
|
||||||
|
if queen == 0
|
||||||
|
then [[]]
|
||||||
|
else extend(n,[], find-solutions(n,queen - 1))
|
||||||
|
|
||||||
|
pub fun queens( n : int ) : div int
|
||||||
|
find-solutions(n,n).length
|
||||||
|
|
||||||
|
pub fun main()
|
||||||
|
queens(get-args().head("").parse-int.default(13)).println
|
||||||
32
koka_bench/koka/nqueens.kk
Normal file
32
koka_bench/koka/nqueens.kk
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
module nqueens
|
||||||
|
import std/num/int32
|
||||||
|
import std/os/env
|
||||||
|
|
||||||
|
alias solution = list<int32>
|
||||||
|
alias solutions = list<list<int32>>
|
||||||
|
|
||||||
|
fun safe( queen : int32, diag : int32, ^xs : solution ) : bool
|
||||||
|
match xs
|
||||||
|
Cons(q,qs) -> (queen != q && queen != (q+diag) && queen != (q - diag) && safe(queen,diag.inc,qs))
|
||||||
|
_ -> True
|
||||||
|
|
||||||
|
fun append-safe( queen : int32, xs : solution, xss : solutions ) : div solutions
|
||||||
|
if queen <= 0.int32 then xss
|
||||||
|
elif safe(queen,1.int32,xs) then append-safe( queen.dec, xs, Cons(Cons(queen,xs),xss) )
|
||||||
|
else append-safe( queen.dec, xs, xss )
|
||||||
|
|
||||||
|
fun extend( queen : int32, acc : solutions, xss : solutions ) : div solutions
|
||||||
|
match xss
|
||||||
|
Cons(xs,rest) -> extend(queen, append-safe(queen,xs,acc), rest)
|
||||||
|
Nil -> acc
|
||||||
|
|
||||||
|
fun find-solutions( n : int32, queen : int32 ) : div solutions
|
||||||
|
if queen.is-zero
|
||||||
|
then [[]]
|
||||||
|
else extend(n, [], find-solutions(n,queen.dec))
|
||||||
|
|
||||||
|
pub fun queens( n : int32 ) : div int
|
||||||
|
find-solutions(n,n).length
|
||||||
|
|
||||||
|
pub fun main()
|
||||||
|
queens(get-args().head("").parse-int.default(13).int32).println
|
||||||
6
koka_bench/rbnqueens_table.md
Normal file
6
koka_bench/rbnqueens_table.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
| Command | Mean [s] | Min [s] | Max [s] | Relative |
|
||||||
|
|:---|---:|---:|---:|---:|
|
||||||
|
| `build/kraken/out/bench/kraken-nqueens 10` | 2.280 ± 0.040 | 2.218 | 2.356 | 493.82 ± 56.59 |
|
||||||
|
| `build/cpp/cpp-nqueens 10` | 0.006 ± 0.001 | 0.006 | 0.008 | 1.32 ± 0.19 |
|
||||||
|
| `build/koka/out/bench/kk-nqueens 10` | 0.005 ± 0.001 | 0.004 | 0.006 | 1.00 |
|
||||||
|
| `build/koka/out/bench/kk-nqueens-int 10` | 0.007 ± 0.001 | 0.006 | 0.009 | 1.46 ± 0.20 |
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
| Command | Mean [s] | Min [s] | Max [s] | Relative |
|
| Command | Mean [s] | Min [s] | Max [s] | Relative |
|
||||||
|:---|---:|---:|---:|---:|
|
|:---|---:|---:|---:|---:|
|
||||||
| `build/kraken/out/bench/kraken-rbtree 42000` | 4.116 ± 0.030 | 4.078 | 4.160 | 862.26 ± 110.34 |
|
| `build/kraken/out/bench/kraken-rbtree-opt 42000` | 3.814 ± 0.021 | 3.775 | 3.850 | 865.95 ± 89.32 |
|
||||||
| `build/cpp/cpp-rbtree 42000` | 0.006 ± 0.001 | 0.005 | 0.008 | 1.22 ± 0.20 |
|
| `build/kraken/out/bench/kraken-rbtree 42000` | 4.133 ± 0.050 | 4.090 | 4.245 | 938.49 ± 97.33 |
|
||||||
| `build/koka/out/bench/kk-rbtree 42000` | 0.005 ± 0.001 | 0.004 | 0.008 | 1.00 |
|
| `build/cpp/cpp-rbtree 42000` | 0.006 ± 0.001 | 0.005 | 0.008 | 1.30 ± 0.20 |
|
||||||
|
| `build/koka/out/bench/kk-rbtree 42000` | 0.004 ± 0.000 | 0.004 | 0.007 | 1.00 |
|
||||||
|
|||||||
@@ -7,7 +7,10 @@ then
|
|||||||
pushd build
|
pushd build
|
||||||
nix develop -i -c bash -c 'cmake .. -DCMAKE_BUILD_TYPE=Release && cmake --build .'
|
nix develop -i -c bash -c 'cmake .. -DCMAKE_BUILD_TYPE=Release && cmake --build .'
|
||||||
popd
|
popd
|
||||||
rm -rf ./build/CMakeFiles || true
|
|
||||||
fi
|
fi
|
||||||
|
pushd build
|
||||||
|
nix develop -i -c bash -c 'make'
|
||||||
|
popd
|
||||||
|
|
||||||
nix develop -i -c bash -c 'ulimit -s unlimited && find build -type f -executable -name \*rbtree -printf "\"%p 42000\"\n" | xargs hyperfine --ignore-failure --warmup 2 --export-markdown rbtree_table.md'
|
nix develop -i -c bash -c 'ulimit -s unlimited && find build -type f -executable -name \*nqueens\* -printf "\"%p 10\"\n" | xargs hyperfine --ignore-failure --warmup 2 --export-markdown rbnqueens_table.md'
|
||||||
|
nix develop -i -c bash -c 'ulimit -s unlimited && find build -type f -executable -name \*rbtree\* -printf "\"%p 42000\"\n" | xargs hyperfine --ignore-failure --warmup 2 --export-markdown rbtree_table.md'
|
||||||
|
|||||||
Reference in New Issue
Block a user