Skip to content

Commit c7fc84b

Browse files
authored
Optimise ImmutableArray for append/update only workloads (#2147)
1 parent 1358e0f commit c7fc84b

5 files changed

Lines changed: 159 additions & 104 deletions

File tree

benchmark/src/main/java/org/finos/vuu/benchmark/BenchmarkHelper.java

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -25,30 +25,13 @@
2525
import java.util.List;
2626
import java.util.Map;
2727

28-
import static org.finos.vuu.benchmark.ColumnNames.ASK;
29-
import static org.finos.vuu.benchmark.ColumnNames.BID;
30-
import static org.finos.vuu.benchmark.ColumnNames.CLOSE;
31-
import static org.finos.vuu.benchmark.ColumnNames.CURRENCY;
32-
import static org.finos.vuu.benchmark.ColumnNames.EXCHANGE;
33-
import static org.finos.vuu.benchmark.ColumnNames.LAST;
34-
import static org.finos.vuu.benchmark.ColumnNames.MINOR_CURRENCY;
35-
import static org.finos.vuu.benchmark.ColumnNames.ORDER_ID;
36-
import static org.finos.vuu.benchmark.ColumnNames.QUANTITY;
37-
import static org.finos.vuu.benchmark.ColumnNames.RIC;
38-
import static org.finos.vuu.benchmark.ColumnNames.TRADER;
39-
import static org.finos.vuu.benchmark.ColumnNames.TRADE_TIME;
40-
import static org.finos.vuu.benchmark.TableDefs.CURRENCIES;
41-
import static org.finos.vuu.benchmark.TableDefs.CURRENCIES_NAME;
42-
import static org.finos.vuu.benchmark.TableDefs.ORDERS;
43-
import static org.finos.vuu.benchmark.TableDefs.ORDERS_NAME;
44-
import static org.finos.vuu.benchmark.TableDefs.ORDER_PRICES_CURRENCIES;
45-
import static org.finos.vuu.benchmark.TableDefs.PRICES;
46-
import static org.finos.vuu.benchmark.TableDefs.PRICES_CURRENCIES;
47-
import static org.finos.vuu.benchmark.TableDefs.PRICES_NAME;
28+
import static org.finos.vuu.benchmark.ColumnNames.*;
29+
import static org.finos.vuu.benchmark.TableDefs.*;
4830
import static org.finos.vuu.util.ScalaCollectionConverter.toScala;
4931

5032
public class BenchmarkHelper {
5133

34+
private static final int MASK = 16_383;
5235
private final Clock clock = new DefaultClock();
5336
private final LifecycleContainer lifecycleContainer = new LifecycleContainer(clock);
5437
private final MetricsProvider metricsProvider = new MetricsProviderImpl();
@@ -78,7 +61,7 @@ public void addCurrencyTableData() {
7861
rowBuilder.setString(dataTable.columnForName(CURRENCY), "GBP");
7962
rowBuilder.setString(dataTable.columnForName(MINOR_CURRENCY), "GBX");
8063
dataTable.processUpdate(rowBuilder.build());
81-
joinProvider.runOnce();
64+
runJoinProvider();
8265
}
8366

8467
public void addPriceTableData(int size) {
@@ -102,11 +85,9 @@ public void addPriceTableData(int size) {
10285
rowBuilder.setDouble(lastColumn, i + 3.0);
10386
rowBuilder.setDouble(closeColumn, i + 4.0);
10487
dataTable.processUpdate(rowBuilder.build());
105-
if (i % 10_000 == 0) {
106-
joinProvider.runOnce();
107-
}
88+
runJoinProviderIfRequired(i);
10889
}
109-
joinProvider.runOnce();
90+
runJoinProvider();
11091
}
11192

11293
public void addOrderTableData(int size) {
@@ -126,11 +107,9 @@ public void addOrderTableData(int size) {
126107
rowBuilder.setLong(tradeTimeColumn, clock.now());
127108
rowBuilder.setDouble(quantityColumn, i);
128109
dataTable.processUpdate(rowBuilder.build());
129-
if (i % 10_000 == 0) {
130-
joinProvider.runOnce();
131-
}
110+
runJoinProviderIfRequired(i);
132111
}
133-
joinProvider.runOnce();
112+
runJoinProvider();
134113
}
135114

136115
public TreeBuilder createTreeBuilder() {
@@ -157,4 +136,14 @@ public TreeBuilder createTreeBuilder() {
157136
clock);
158137
}
159138

139+
public void runJoinProviderIfRequired(int iteration) {
140+
if ((iteration & MASK) == 0) {
141+
runJoinProvider();
142+
}
143+
}
144+
145+
public void runJoinProvider() {
146+
joinProvider.runOnce();
147+
}
148+
160149
}

benchmark/src/main/java/org/finos/vuu/benchmark/table/InMemDataTableBenchmark.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,29 @@ public void addRows(int size) {
2020
}
2121

2222
public void iterateRows(Blackhole bh) {
23-
dataTable.primaryKeys().foreach(v1 -> {
24-
bh.consume(dataTable.pullRow(v1));
25-
return null;
26-
});
23+
var keys = dataTable.primaryKeys();
24+
for (int i = 0; i < keys.size(); i++) {
25+
bh.consume(dataTable.pullRow(keys.get(i)));
26+
}
2727
}
2828

2929
public void removeRows(int size) {
30+
var keys = dataTable.primaryKeys();
3031
for (int i = 0; i < size; i++) {
31-
dataTable.processDelete(dataTable.primaryKeys().head());
32+
dataTable.processDelete(keys.get(i));
33+
benchmarkHelper.runJoinProviderIfRequired(i);
3234
}
35+
benchmarkHelper.runJoinProvider();
3336
}
3437

3538
public void updateRows(int size) {
39+
var keys = dataTable.primaryKeys();
3640
for (int i = 0; i < size; i++) {
37-
var existingRow = dataTable.pullRow(dataTable.primaryKeys().head());
41+
var existingRow = dataTable.pullRow(keys.get(i));
3842
dataTable.processUpdate(existingRow);
43+
benchmarkHelper.runJoinProviderIfRequired(i);
3944
}
45+
benchmarkHelper.runJoinProvider();
4046
}
4147

4248
}

benchmark/src/main/java/org/finos/vuu/benchmark/table/InMemDataTableBenchmarkRunner.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class InMemDataTableBenchmarkRunner {
2727
@Param({ "50000", "250000", "500000" })
2828
public int insertSize;
2929

30-
@Setup(Level.Invocation)
30+
@Setup(Level.Iteration)
3131
public void setup() {
3232
benchmark = new InMemDataTableBenchmark(benchmarkHelper);
3333
benchmark.addRows(insertSize);
@@ -43,16 +43,6 @@ public void iterateRows(Blackhole bh) throws IOException {
4343
benchmark.iterateRows(bh);
4444
}
4545

46-
@Benchmark
47-
@OutputTimeUnit(TimeUnit.MILLISECONDS)
48-
@Warmup(iterations = 5)
49-
@Measurement(iterations = 5)
50-
@Fork(1)
51-
@BenchmarkMode(Mode.SampleTime)
52-
public void removeRows() throws IOException {
53-
benchmark.removeRows(insertSize);
54-
}
55-
5646
@Benchmark
5747
@OutputTimeUnit(TimeUnit.MILLISECONDS)
5848
@Warmup(iterations = 5)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.finos.vuu.benchmark.table;
2+
3+
import org.finos.vuu.benchmark.BenchmarkHelper;
4+
import org.openjdk.jmh.annotations.*;
5+
6+
import java.io.IOException;
7+
import java.util.concurrent.TimeUnit;
8+
9+
@State(Scope.Thread)
10+
public class InMemDataTableRemovalBenchmarkRunner {
11+
12+
private final BenchmarkHelper benchmarkHelper = new BenchmarkHelper();
13+
private InMemDataTableBenchmark benchmark;
14+
15+
@Param({ "5000", "50000", "100000" })
16+
public int insertSize;
17+
18+
@Setup(Level.Invocation)
19+
public void setup() {
20+
benchmark = new InMemDataTableBenchmark(benchmarkHelper);
21+
benchmark.addRows(insertSize);
22+
}
23+
24+
@Benchmark
25+
@OutputTimeUnit(TimeUnit.MILLISECONDS)
26+
@Warmup(iterations = 5)
27+
@Measurement(iterations = 5)
28+
@Fork(1)
29+
@BenchmarkMode(Mode.SampleTime)
30+
public void removeRows() throws IOException {
31+
benchmark.removeRows(insertSize);
32+
}
33+
34+
}

0 commit comments

Comments
 (0)