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 }