Skip to content

Commit c053e4b

Browse files
committed
Added datomic.BTSet to the bench
1 parent aa67e7a commit c053e4b

4 files changed

Lines changed: 75 additions & 25 deletions

File tree

bench.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
javac -d target/classes -cp `clojure -A:datomic -Spath` -Xlint:unchecked src-java/datascript/*.java && java -ea -cp `clojure -A:datomic -Spath`:target/classes datascript.Bench

src-java/datascript/ASortedSet.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
// (rseq [this] (rseq (btset-iter this)))
88

99
@SuppressWarnings("unchecked")
10-
public abstract class ASortedSet implements IObj, IPersistentSet, ILookup, Iterable, ISortedSet, Set, java.io.Serializable, IHashEq {
10+
public abstract class ASortedSet implements IObj, IPersistentSet, ILookup, Iterable, Set, java.io.Serializable, IHashEq {
1111
int _hash;
1212
int _hasheq;
1313
final IPersistentMap _meta;

src-java/datascript/Bench.java

Lines changed: 68 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import java.util.*;
44
import java.util.stream.*;
55
import clojure.lang.*;
6+
import clojure.java.api.Clojure;
7+
import datomic.btset.BTSet;
68

79
abstract class ABench {
810
Class<? extends ISortedSet> setClass;
@@ -128,10 +130,52 @@ void run() {
128130
}
129131
}
130132

133+
@SuppressWarnings("unchecked")
134+
abstract class APersistentCollection<T extends IPersistentCollection & IPersistentSet> implements ISortedSet {
135+
T _impl;
136+
137+
abstract APersistentCollection<T> create(T _impl);
138+
139+
public ISortedSet with(Object o) { return create((T) _impl.cons(o)); }
140+
public ISortedSet without(Object o) { return create((T) _impl.disjoin(o)); }
141+
public int size() { return _impl.count(); }
142+
public boolean contains(Object o) { return _impl.contains(o); }
143+
144+
public Iterator iterator() { return ((Iterable) _impl).iterator(); }
145+
public ISortedSet toTransient() { return create((T) ((IEditableCollection)_impl).asTransient()); }
146+
public ISortedSet toPersistent() { return create((T) ((ITransientCollection)_impl).persistent()); }
147+
}
148+
149+
class DatomicSet extends APersistentCollection<BTSet> {
150+
static IFn ctor;
151+
static {
152+
Symbol ns = (Symbol) Clojure.var("clojure.core", "symbol").invoke("datomic.api");
153+
Clojure.var("clojure.core", "require").invoke(ns);
154+
ctor = (IFn) Clojure.var("datomic.btset", "btset");
155+
}
156+
157+
DatomicSet(BTSet impl) { _impl = impl; }
158+
DatomicSet(int ml) { _impl = (BTSet) ctor.invoke(); }
159+
DatomicSet create(BTSet impl) { return new DatomicSet(impl); }
160+
public ISeq seq() { return _impl.seq(); }
161+
}
162+
163+
164+
class DatascriptSet extends APersistentCollection<ClojureSet> {
165+
DatascriptSet(ClojureSet impl) { _impl = impl; }
166+
DatascriptSet(int ml) {
167+
ClojureSet.setMaxLen(ml);
168+
_impl = new ClojureSet();
169+
}
170+
DatascriptSet create(ClojureSet impl) { return new DatascriptSet(impl);}
171+
public ISeq seq() { return _impl.seq(); }
172+
}
173+
174+
131175
public class Bench {
132-
static Integer[] maxLens = new Integer[]{8,16,32,64,128,256,512,1024};
176+
// static Integer[] maxLens = new Integer[]{8,16,32,64,128,256,512,1024};
133177
// static Integer[] maxLens = new Integer[]{32, 64, 128};
134-
// static Integer[] maxLens = new Integer[]{64};
178+
static Integer[] maxLens = new Integer[]{64};
135179
static int warmups = 100;
136180
static int runs = 50;
137181

@@ -156,11 +200,11 @@ public static String range(Collection<Long> coll) {
156200
}
157201

158202
public static void runBench(Class<? extends ABench> benchClass, Collection source, Class<? extends ISortedSet> setClass) throws Exception {
159-
runBench(benchClass, source, setClass, true);
203+
runBench(benchClass, source, setClass, false);
160204
}
161205

162206
public static void runBench(Class<? extends ABench> benchClass, Collection source, Class<? extends ISortedSet> setClass, boolean asTransient) throws Exception {
163-
System.out.print(String.format("%-20s", setClass.getSimpleName() + (asTransient ? "" : "🔒")));
207+
System.out.print(String.format("%-20s", setClass.getSimpleName() + (asTransient ? "♻️" : "🔒")));
164208
for(int maxLen: maxLens) {
165209
ABench bench = benchClass.getDeclaredConstructor(Class.class, Collection.class, boolean.class, int.class).newInstance(setClass, source, asTransient, maxLen);
166210
for(int i=0; i < warmups; ++i)
@@ -178,12 +222,15 @@ public static void runBench(Class<? extends ABench> benchClass, Collection sourc
178222
}
179223

180224
public static void main(String args[]) throws Exception {
225+
new DatomicSet(0);
226+
181227
System.out.println("Lengths " + String.join(" ", Arrays.stream(maxLens).map((ml)-> ml.toString() + " max").collect(Collectors.toList())));
182228

183229
ArrayList<Long> source = randomList(100000);
184230
ArrayList<Long> bigSource = randomList(1000000);
185231

186232
System.out.println("\n === 100K ADDs ===");
233+
runBench(AddBench.class, source, DatomicSet.class);
187234
// runBench(AddBench.class, source, PersistentBTSet.class, false);
188235
// runBench(AddBench.class, source, TransientBTSet.class, true);
189236
// runBench(AddBench.class, source, TwoNodesSet.class, true);
@@ -197,17 +244,18 @@ public static void main(String args[]) throws Exception {
197244
// runBench(AddBench.class, source, AtomicBooleanSet.class, true);
198245
// runBench(AddBench.class, source, CleanupSet.class, false);
199246
// runBench(AddBench.class, source, CleanupSet.class, true);
200-
// runBench(AddBench.class, source, ClojureSet.class, false);
201-
runBench(AddBench.class, source, ClojureSet.class, true);
247+
runBench(AddBench.class, source, DatascriptSet.class, false);
248+
runBench(AddBench.class, source, DatascriptSet.class, true);
202249

203250
System.out.println("\n === 100K CONTAINS ===");
251+
runBench(ContainsBench.class, source, DatomicSet.class);
204252
// runBench(ContainsBench.class, source, SmallTransientSet.class );
205253
// runBench(ContainsBench.class, source, LinearSearchSet.class );
206254
// runBench(ContainsBench.class, source, FlatIterSet.class );
207255
// runBench(ContainsBench.class, source, ReverseFlatIterSet.class);
208256
// runBench(ContainsBench.class, source, AtomicBooleanSet.class);
209257
// runBench(ContainsBench.class, source, CleanupSet.class);
210-
runBench(ContainsBench.class, source, ClojureSet.class);
258+
runBench(ContainsBench.class, source, DatascriptSet.class);
211259

212260
System.out.println("\n === ITERATE over 1M ===");
213261
// runBench(IterateBench.class, bigSource, LinearSearchSet.class );
@@ -216,10 +264,11 @@ public static void main(String args[]) throws Exception {
216264
// runBench(IterateBench.class, bigSource, AtomicBooleanSet.class );
217265
// runBench(IterateBench.class, bigSource, CleanupSet.class );
218266
// runBench(IterateBench.class, bigSource, SliceSet.class );
219-
runBench(IterateBench.class, bigSource, ClojureSet.class);
267+
runBench(IterateBench.class, bigSource, DatascriptSet.class);
220268

221269
System.out.println("\n === SEQ ITER over 1M ===");
222-
runBench(SeqIterateBench.class, bigSource, ClojureSet.class);
270+
runBench(SeqIterateBench.class, bigSource, DatomicSet.class);
271+
runBench(SeqIterateBench.class, bigSource, DatascriptSet.class);
223272

224273
System.out.println("\n === 100K REMOVEs ===");
225274
// runBench(RemoveBench.class, source, DisjoinSet.class, false);
@@ -228,22 +277,22 @@ public static void main(String args[]) throws Exception {
228277
// runBench(RemoveBench.class, source, EarlyExitDisjSet.class, true);
229278
// runBench(RemoveBench.class, source, CleanupSet.class, false);
230279
// runBench(RemoveBench.class, source, CleanupSet.class, true);
231-
// runBench(RemoveBench.class, source, ClojureSet.class, false);
232-
runBench(RemoveBench.class, source, ClojureSet.class, true);
280+
runBench(RemoveBench.class, source, DatascriptSet.class, false);
281+
runBench(RemoveBench.class, source, DatascriptSet.class, true);
233282

234-
ClojureSet.setMaxLen(4);
235-
ClojureSet s = (ClojureSet) new ClojureSet().toTransient();
283+
// ClojureSet.setMaxLen(4);
284+
// ClojureSet s = (ClojureSet) new ClojureSet().asTransient();
236285

237-
for(Long l: randomList(20))
238-
s = s.with(l);
286+
// for(Long l: randomList(20))
287+
// s = s.cons(l);
239288

240-
// s = (ClojureSet) s.toPersistent();
289+
// s = (ClojureSet) s.persistent();
241290

242291
// for(Long l: randomList(20))
243-
// s = s.without(l);
292+
// s = s.disjoin(l);
244293

245-
System.out.println(s);
246-
System.out.println(s.str());
294+
// System.out.println(s);
295+
// System.out.println(s.str());
247296

248297
// Comparator<Integer> cmp = (a, b) -> (a / 10) - (b / 10);
249298
// ISeq seq = s.slice(30, 30, cmp);

src-java/datascript/ClojureSet.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -193,11 +193,11 @@ public Iterator iterator() {
193193
}
194194

195195
// ISortedSet
196-
public ClojureSet(int ml) { this(); setMaxLen(ml); }
197-
public ClojureSet with(Object key) { return cons(key); }
198-
public ClojureSet without(Object key) { return disjoin(key); }
199-
public ClojureSet toTransient() { return (ClojureSet) asTransient(); }
200-
public ClojureSet toPersistent() { return (ClojureSet) persistent(); }
196+
// public ClojureSet(int ml) { this(); setMaxLen(ml); }
197+
// public ClojureSet with(Object key) { return cons(key); }
198+
// public ClojureSet without(Object key) { return disjoin(key); }
199+
// public ClojureSet toTransient() { return (ClojureSet) asTransient(); }
200+
// public ClojureSet toPersistent() { return (ClojureSet) persistent(); }
201201

202202
// ===== LEAF =====
203203

0 commit comments

Comments
 (0)