1 /** 2 Copyright: Copyright (c) 2018, Joakim Brännström. All rights reserved. 3 License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0) 4 Author: Joakim Brännström (joakim.brannstrom@gmx.com) 5 6 This file contains benchmarks of the datacat implementation. 7 */ 8 module datacat_test.benchmark; 9 10 import core.time; 11 import logger = std.experimental.logger; 12 import std.algorithm : map, filter; 13 import std.range : iota; 14 15 import datacat; 16 import datacat_test.common; 17 18 void perf_join() { 19 auto bench() { 20 // arrange 21 Iteration iter; 22 auto variable = iter.variable!(int, int)("source"); 23 variable.insert(relation!(int, int).from(iota(100).map!(x => tuple(x, x + 1)))); 24 // [[0,1],[1,2],[2,3],] 25 variable.insert(relation!(int, int).from(iota(100).map!(x => tuple(x + 1, x)))); 26 // [[1,0],[2,1],[3,2],] 27 28 // act 29 while (iter.changed) { 30 static auto helper(T0, T1, T2)(T0 k, T1 v1, T2 v2) { 31 return kvTuple(v1, v2); 32 } 33 34 variable.fromJoin!(helper)(variable, variable); 35 } 36 37 return variable.complete; 38 } 39 40 auto r = benchmark!(bench)(10); 41 logger.infof("%s %s: %s", __FUNCTION__, __LINE__, r); 42 } 43 44 void perf_antijoin() { 45 auto bench() { 46 // arrange 47 Iteration iter; 48 auto variable = iter.variable!(int, int)("source"); 49 variable.insert(relation!(int, int).from(iota(100).map!(x => kvTuple(x, x + 1)))); 50 auto relation_ = relation!(int).from(iota(100).filter!(x => x % 3 == 0) 51 .map!kvTuple); 52 53 // act 54 while (iter.changed) { 55 static auto helper(T0, T1)(T0 k, T1 v) { 56 return kvTuple(v, k); 57 } 58 59 variable.fromAntiJoin!(helper)(variable, relation_); 60 } 61 62 return variable.complete; 63 } 64 65 auto r = benchmark!(bench)(10); 66 logger.infof("%s %s: %s", __FUNCTION__, __LINE__, r); 67 } 68 69 void perf_map() { 70 auto bench() { 71 // arrange 72 Iteration iter; 73 auto variable = iter.variable!(int, int)("source"); 74 variable.insert(relation!(int, int).from(iota(100).map!(x => kvTuple(x, x)))); 75 76 // act 77 while (iter.changed) { 78 static auto helper(KV)(KV a) { 79 if (a.value % 2 == 0) 80 return kvTuple(a.key, a.value / 2); 81 else 82 return kvTuple(a.key, 3 * a.value + 1); 83 } 84 85 variable.fromMap!(helper)(variable); 86 } 87 88 return variable.complete; 89 } 90 91 auto r = benchmark!(bench)(10); 92 logger.infof("%s %s: %s", __FUNCTION__, __LINE__, r); 93 }