Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
34 changes: 8 additions & 26 deletions bench/MemoryBTree/BTree-specific-fns.bench.mo
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import Iter "mo:base/Iter";
import Debug "mo:base/Debug";
import Nat "mo:base/Nat";
import Buffer "mo:base/Buffer";
import Nat64 "mo:base/Nat64";
import Iter "mo:base@.v0.14.11/Iter";
import Debug "mo:base@.v0.14.11/Debug";
import Nat "mo:base@.v0.14.11/Nat";
import Buffer "mo:base@.v0.14.11/Buffer";
import Nat64 "mo:base@.v0.14.11/Nat64";

import Bench "mo:bench";
import Fuzz "mo:fuzz";
import Fuzz "mo:fuzz@.v1.0.0";

import { BpTree; Cmp } "mo:augmented-btrees";
import { BpTree; Cmp } "mo:augmented-btrees@.v0.7.1";

import MemoryBTree "../../src/MemoryBTree/Base";
import TypeUtils "../../src/TypeUtils";
Expand All @@ -16,25 +16,7 @@ module {
type MemoryBTree = MemoryBTree.MemoryBTree;

public func init() : Bench.Bench {
func xorshift128plus(seed : Nat) : { next() : Nat } {
var state0 : Nat64 = Nat64.fromNat(seed);
var state1 : Nat64 = Nat64.fromNat(seed + 1);
if (state0 == 0) state0 := 1;
if (state1 == 0) state1 := 2;

{
next = func() : Nat {
var s1 = state0;
let s0 = state1;
state0 := s0;
s1 ^= s1 << 23 : Nat64;
state1 := s1 ^ s0 ^ (s1 >> 18 : Nat64) ^ (s0 >> 5 : Nat64);
Nat64.toNat(state1 +% s0); // Use wrapping addition
};
};
};

let fuzz = Fuzz.create(xorshift128plus(0xdeadbeef));
let fuzz = Fuzz.fromSeed(0xdeadbeef);

let bench = Bench.Bench();
bench.name("Comparing B+Tree and MemoryBTree");
Expand Down
62 changes: 8 additions & 54 deletions bench/MemoryBTree/BTree.Types.bench.mo
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
import Iter "mo:base/Iter";
import Debug "mo:base/Debug";
import Buffer "mo:base/Buffer";
import Text "mo:base/Text";
import Nat "mo:base/Nat";
import Nat64 "mo:base/Nat64";
import Iter "mo:base@.v0.14.11/Iter";
import Debug "mo:base@.v0.14.11/Debug";
import Buffer "mo:base@.v0.14.11/Buffer";
import Text "mo:base@.v0.14.11/Text";
import Nat "mo:base@.v0.14.11/Nat";
import Nat64 "mo:base@.v0.14.11/Nat64";

import Bench "mo:bench";
import Fuzz "mo:fuzz";
import MotokoStableBTree "mo:MotokoStableBTree/BTree";
import Fuzz "mo:fuzz@.v1.0.0";

import MemoryBTree "../../src/MemoryBTree/Base";
import TypeUtils "../../src/TypeUtils";
Expand All @@ -20,25 +19,7 @@ module {
type Buffer<T> = Buffer.Buffer<T>;

public func init() : Bench.Bench {
func xorshift128plus(seed : Nat) : { next() : Nat } {
var state0 : Nat64 = Nat64.fromNat(seed);
var state1 : Nat64 = Nat64.fromNat(seed + 1);
if (state0 == 0) state0 := 1;
if (state1 == 0) state1 := 2;

{
next = func() : Nat {
var s1 = state0;
let s0 = state1;
state0 := s0;
s1 ^= s1 << 23 : Nat64;
state1 := s1 ^ s0 ^ (s1 >> 18 : Nat64) ^ (s0 >> 5 : Nat64);
Nat64.toNat(state1 +% s0); // Use wrapping addition
};
};
};

let fuzz = Fuzz.create(xorshift128plus(0xdeadbeef));
let fuzz = Fuzz.fromSeed(0xdeadbeef);

let bench = Bench.Bench();
bench.name("Comparing B+Tree and Memory B+Tree with different serialization formats and comparison functions");
Expand All @@ -47,11 +28,8 @@ module {
bench.rows([
"Memory B+Tree - Text (#BlobCmp)",
"Memory B+Tree - Text (#GenCmp)",
"Memory B+Tree - Candid Text (#BlobCmp)",
"Memory B+Tree - Candid Text (#GenCmp)",
"Memory B+Tree - Nat (#BlobCmp)",
"Memory B+Tree - Nat (#GenCmp)",
"Memory B+Tree - Candid Nat (#GenCmp)",
]);

bench.cols([
Expand All @@ -65,19 +43,11 @@ module {

let limit = 10_000;

let { n64conv; tconv } = MotokoStableBTree;

let tconv_10 = tconv(10);

let mem_btree_text_gen_cmp = MemoryBTree.new(?128);
let mem_btree_text_blob_cmp = MemoryBTree.new(?128);
let mem_btree_candid_text_gen_cmp = MemoryBTree.new(?128);
let mem_btree_candid_text_blob_cmp = MemoryBTree.new(?128);

let mem_btree_nat_gen_cmp = MemoryBTree.new(?128);
let mem_btree_nat_blob_cmp = MemoryBTree.new(?128);
let mem_btree_candid_nat_gen_cmp = MemoryBTree.new(?128);
let mem_btree_candid_nat_blob_cmp = MemoryBTree.new(?128);

let entries = Buffer.Buffer<(Text, Text)>(limit);
let nat_entries = Buffer.Buffer<(Nat, Nat)>(limit);
Expand Down Expand Up @@ -138,17 +108,12 @@ module {
let btree_utils = MemoryBTree.createUtils(TypeUtils.Text, TypeUtils.Text);
let gen_cmp_text_utils = MemoryBTree.createUtils({ TypeUtils.Text with cmp = #GenCmp(Int8Cmp.Text) }, TypeUtils.Text);

let candid_text_utils = MemoryBTree.createUtils({ TypeUtils.Text with cmp = TypeUtils.MemoryCmp.Default }, TypeUtils.Candid.Text);
let candid_text_gen_cmp_utils = MemoryBTree.createUtils({ TypeUtils.Candid.Text with cmp = #GenCmp(Int8Cmp.Text) }, TypeUtils.Candid.Text);

let nat_btree_utils = MemoryBTree.createUtils({ TypeUtils.Nat with cmp = TypeUtils.MemoryCmp.Default }, TypeUtils.Nat);
let nat_gen_cmp_utils = MemoryBTree.createUtils(
{ TypeUtils.Nat with cmp = #GenCmp(Int8Cmp.Nat) },
TypeUtils.Nat,
);

let candid_nat_utils = MemoryBTree.createUtils(TypeUtils.Candid.Nat, TypeUtils.Candid.Nat);

bench.runner(
func(col, row) = switch (col, row) {

Expand All @@ -160,14 +125,6 @@ module {
run_bench("Memory B+Tree", category, mem_btree_text_gen_cmp, gen_cmp_text_utils, entries, Text.equal);
};

case ("Memory B+Tree - Candid Text (#BlobCmp)", category) {
run_bench("Memory B+Tree", category, mem_btree_candid_text_blob_cmp, candid_text_utils, entries, Text.equal);
};

case ("Memory B+Tree - Candid Text (#GenCmp)", category) {
run_bench("Memory B+Tree", category, mem_btree_candid_text_gen_cmp, candid_text_gen_cmp_utils, entries, Text.equal);
};

case ("Memory B+Tree - Nat (#BlobCmp)", category) {
run_bench("Memory B+Tree", category, mem_btree_nat_blob_cmp, nat_btree_utils, nat_entries, Nat.equal);
};
Expand All @@ -176,9 +133,6 @@ module {
run_bench<Nat, Nat>("Memory B+Tree", category, mem_btree_nat_gen_cmp, nat_gen_cmp_utils, nat_entries, Nat.equal);
};

case ("Memory B+Tree - Candid Nat (#GenCmp)", category) {
run_bench("Memory B+Tree", category, mem_btree_candid_nat_gen_cmp, candid_nat_utils, nat_entries, Nat.equal);
};
case (_) {
Debug.trap("Should not reach with row = " # debug_show row # " and col = " # debug_show col);
};
Expand Down
81 changes: 12 additions & 69 deletions bench/MemoryBTree/MemoryBTree.bench.mo
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@
import Iter "mo:base/Iter";
import Debug "mo:base/Debug";
import Nat64 "mo:base/Nat64";
import Region "mo:base/Region";
import Buffer "mo:base/Buffer";
import Text "mo:base/Text";
import RBTree "mo:base/RBTree";

import BTree "mo:stableheapbtreemap/BTree";
import Iter "mo:base@.v0.14.11/Iter";
import Debug "mo:base@.v0.14.11/Debug";
import Nat64 "mo:base@.v0.14.11/Nat64";
import Region "mo:base@.v0.14.11/Region";
import Buffer "mo:base@.v0.14.11/Buffer";
import Text "mo:base@.v0.14.11/Text";
import RBTree "mo:base@.v0.14.11/RBTree";

import BTree "mo:stableheapbtreemap@.v1.5.0/BTree";
import Bench "mo:bench";
import Fuzz "mo:fuzz";
import MotokoStableBTree "mo:MotokoStableBTree/BTree";
import BTreeMap "mo:MotokoStableBTree/modules/btreemap";
import BTreeMapMemory "mo:MotokoStableBTree/modules/memory";
import Fuzz "mo:fuzz@.v1.0.0";

import { BpTree; Cmp } "mo:augmented-btrees";
import { BpTree; Cmp } "mo:augmented-btrees@.v0.7.1";

import MemoryBTree "../../src/MemoryBTree/Base";
import TypeUtils "../../src/TypeUtils";
Expand All @@ -24,25 +21,7 @@ module {
type BTreeUtils<K, V> = MemoryBTree.BTreeUtils<K, V>;

public func init() : Bench.Bench {
func xorshift128plus(seed : Nat) : { next() : Nat } {
var state0 : Nat64 = Nat64.fromNat(seed);
var state1 : Nat64 = Nat64.fromNat(seed + 1);
if (state0 == 0) state0 := 1;
if (state1 == 0) state1 := 2;

{
next = func() : Nat {
var s1 = state0;
let s0 = state1;
state0 := s0;
s1 ^= s1 << 23 : Nat64;
state1 := s1 ^ s0 ^ (s1 >> 18 : Nat64) ^ (s0 >> 5 : Nat64);
Nat64.toNat(state1 +% s0); // Use wrapping addition
};
};
};

let fuzz = Fuzz.create(xorshift128plus(0xdeadbeef));
let fuzz = Fuzz.fromSeed(0xdeadbeef);

let bench = Bench.Bench();
bench.name("Comparing RBTree, BTree and B+Tree (BpTree)");
Expand All @@ -66,13 +45,9 @@ module {

let limit = 10_000;

let { n64conv; tconv } = MotokoStableBTree;

let tconv_10 = tconv(10);
let rbtree = RBTree.RBTree<Text, Text>(Text.compare);
let btree = BTree.init<Text, Text>(?32);
let bptree = BpTree.new<Text, Text>(?128);
let stable_btree = BTreeMap.new<Text, Text>(BTreeMapMemory.RegionMemory(Region.new()), tconv_10, tconv_10);
let mem_btree = MemoryBTree.new(?128);
let mem_btree_blob_cmp = MemoryBTree.new(?128);

Expand Down Expand Up @@ -242,38 +217,6 @@ module {
};
};

case ("MotokoStableBTree", "insert()") {
for ((key, val) in entries.vals()) {
ignore stable_btree.insert(key, tconv_10, val, tconv_10);
};
};
case ("MotokoStableBTree", "replace()") {
for ((key, val) in entries.vals()) {
ignore stable_btree.insert(key, tconv_10, val, tconv_10);
};
};
case ("MotokoStableBTree", "get()") {
for (i in Iter.range(0, limit - 1)) {
let (key, val) = entries.get(i);
ignore stable_btree.get(key, tconv_10, tconv_10);
};
};
case ("MotokoStableBTree", "entries()") {
var i = 0;
for (kv in stable_btree.iter(tconv_10, tconv_10)) {
i += 1;
};

assert Nat64.fromNat(i) == stable_btree.getLength();
Debug.print("Size: " # debug_show (i, stable_btree.getLength()));
};
case ("MotokoStableBTree", "scan()") {};
case ("MotokoStableBTree", "remove()") {
for ((k, v) in entries.vals()) {
ignore stable_btree.remove(k, tconv_10, tconv_10);
};
};

case ("Memory B+Tree (#BlobCmp)", category) {
run_bench("Memory B+Tree", category, mem_btree_blob_cmp, btree_utils);
};
Expand Down
78 changes: 10 additions & 68 deletions bench/MemoryBTree/MemoryBTree.node-capacity.bench.mo
Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
import Iter "mo:base/Iter";
import Debug "mo:base/Debug";
import Nat "mo:base/Nat";
import Nat64 "mo:base/Nat64";
import Region "mo:base/Region";
import Buffer "mo:base/Buffer";
import Text "mo:base/Text";
import Iter "mo:base@.v0.14.11/Iter";
import Debug "mo:base@.v0.14.11/Debug";
import Nat "mo:base@.v0.14.11/Nat";
import Nat64 "mo:base@.v0.14.11/Nat64";
import Region "mo:base@.v0.14.11/Region";
import Buffer "mo:base@.v0.14.11/Buffer";
import Text "mo:base@.v0.14.11/Text";

import Bench "mo:bench";
import Fuzz "mo:fuzz";
import MotokoStableBTree "mo:MotokoStableBTree/BTree";
import BTreeMap "mo:MotokoStableBTree/modules/btreemap";
import BTreeMapMemory "mo:MotokoStableBTree/modules/memory";
import Fuzz "mo:fuzz@.v1.0.0";

import { BpTree; Cmp } "mo:augmented-btrees";
import { BpTree; Cmp } "mo:augmented-btrees@.v0.7.1";

import MemoryBTree "../../src/MemoryBTree/Base";
import TypeUtils "../../src/TypeUtils";
Expand All @@ -22,25 +19,7 @@ module {
type MemoryBTree = MemoryBTree.MemoryBTree;

public func init() : Bench.Bench {
func xorshift128plus(seed : Nat) : { next() : Nat } {
var state0 : Nat64 = Nat64.fromNat(seed);
var state1 : Nat64 = Nat64.fromNat(seed + 1);
if (state0 == 0) state0 := 1;
if (state1 == 0) state1 := 2;

{
next = func() : Nat {
var s1 = state0;
let s0 = state1;
state0 := s0;
s1 ^= s1 << 23 : Nat64;
state1 := s1 ^ s0 ^ (s1 >> 18 : Nat64) ^ (s0 >> 5 : Nat64);
Nat64.toNat(state1 +% s0); // Use wrapping addition
};
};
};

let fuzz = Fuzz.create(xorshift128plus(0xdeadbeef));
let fuzz = Fuzz.fromSeed(0xdeadbeef);

let bench = Bench.Bench();
bench.name("Comparing the Memory B+Tree with different node capacities");
Expand Down Expand Up @@ -69,12 +48,7 @@ module {

let limit = 10_000;

let { n64conv; tconv } = MotokoStableBTree;

let tconv_10 = tconv(10);

let bptree = BpTree.new<Text, Text>(?32);
let stable_btree = BTreeMap.new<Text, Text>(BTreeMapMemory.RegionMemory(Region.new()), tconv_10, tconv_10);
let mem_btree_order_4 = MemoryBTree.new(?4);
let mem_btree_order_32 = MemoryBTree.new(?32);
let mem_btree_order_64 = MemoryBTree.new(?64);
Expand Down Expand Up @@ -225,38 +199,6 @@ module {
};
};

case ("MotokoStableBTree", "insert()") {
for ((key, val) in entries.vals()) {
ignore stable_btree.insert(key, tconv_10, val, tconv_10);
};
};
case ("MotokoStableBTree", "replace()") {
for ((key, val) in replacements.vals()) {
ignore stable_btree.insert(key, tconv_10, val, tconv_10);
};
};
case ("MotokoStableBTree", "get()") {
for (i in Iter.range(0, limit - 1)) {
let (key, val) = entries.get(i);
ignore stable_btree.get(key, tconv_10, tconv_10);
};
};
case ("MotokoStableBTree", "entries()") {
var i = 0;
for (kv in stable_btree.iter(tconv_10, tconv_10)) {
i += 1;
};

assert Nat64.fromNat(i) == stable_btree.getLength();
Debug.print("Size: " # debug_show (i, stable_btree.getLength()));
};
case ("MotokoStableBTree", "scan()") {};
case ("MotokoStableBTree", "remove()") {
for ((k, v) in entries.vals()) {
ignore stable_btree.remove(k, tconv_10, tconv_10);
};
};

case ("Memory B+Tree (4)", category) {
run_bench("Memory B+Tree", category, mem_btree_order_4);
};
Expand Down
Loading
Loading