33import java .util .*;
44import java .util .stream .*;
55import clojure .lang .*;
6+ import clojure .java .api .Clojure ;
7+ import datomic .btset .BTSet ;
68
79abstract 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+
131175public 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);
0 commit comments