From 1a861b65cb119a6854a89cd2b7bbb3068266deea Mon Sep 17 00:00:00 2001 From: Dmitry Pisklov Date: Wed, 31 Oct 2018 20:29:08 +0000 Subject: [PATCH 1/2] Fixes #164 --- .gitignore | 1 + .../chronicle/map/perf/MapJLBHTest.java | 123 ++++++++++++++++++ 2 files changed, 124 insertions(+) create mode 100644 src/test/java/net/openhft/chronicle/map/perf/MapJLBHTest.java diff --git a/.gitignore b/.gitignore index a40e8a1f9..b629cecf1 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ # This is copied from OpenHFT/.gitignore # update the original and run OpenHFT/update_gitignore.sh data/ +perfmap/ ### Compiled class file *.class diff --git a/src/test/java/net/openhft/chronicle/map/perf/MapJLBHTest.java b/src/test/java/net/openhft/chronicle/map/perf/MapJLBHTest.java new file mode 100644 index 000000000..e3fbaaa25 --- /dev/null +++ b/src/test/java/net/openhft/chronicle/map/perf/MapJLBHTest.java @@ -0,0 +1,123 @@ +/* + * Copyright 2014-2018 Chronicle Software + * + * http://chronicle.software + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package net.openhft.chronicle.map.perf; + +import net.openhft.chronicle.bytes.BytesIn; +import net.openhft.chronicle.bytes.BytesMarshallable; +import net.openhft.chronicle.bytes.BytesOut; +import net.openhft.chronicle.core.Jvm; +import net.openhft.chronicle.core.io.IORuntimeException; +import net.openhft.chronicle.core.io.IOTools; +import net.openhft.chronicle.core.jlbh.JLBH; +import net.openhft.chronicle.core.jlbh.JLBHOptions; +import net.openhft.chronicle.core.jlbh.JLBHTask; +import net.openhft.chronicle.core.util.NanoSampler; +import net.openhft.chronicle.map.ChronicleMap; +import net.openhft.chronicle.map.ChronicleMapBuilder; + +import java.io.File; +import java.io.IOException; + +public class MapJLBHTest implements JLBHTask { + private static final int WARM_UP_ITERATIONS = 40_000; + private ChronicleMap read; + private ChronicleMap write; + private NanoSampler readSampler; + private NanoSampler writeSampler; + private NanoSampler e2eSampler; + private File mapFile = new File("perfmap/map.cm3"); + + public static void main(String[] args) { + //Create the JLBH options you require for the benchmark + JLBHOptions options = new JLBHOptions() + .warmUpIterations(WARM_UP_ITERATIONS) + .iterations(500_000) + .throughput(40_000) + .runs(3) + .recordOSJitter(false) + .accountForCoordinatedOmmission(false) + .jlbhTask(new MapJLBHTest()); + new JLBH(options).start(); + } + + @Override + public void init(JLBH jlbh) { + IOTools.deleteDirWithFiles("perfmap", 10); + mapFile.getParentFile().mkdirs(); + readSampler = jlbh.addProbe("Read"); + writeSampler = jlbh.addProbe("Write"); + e2eSampler = jlbh; + + Datum sampleValue = new Datum(); + try { + write = ChronicleMapBuilder.of(Long.class, Datum.class).constantValueSizeBySample(sampleValue).entries(1_100_000).createOrRecoverPersistedTo(mapFile); + read = ChronicleMapBuilder.of(Long.class, Datum.class).constantValueSizeBySample(sampleValue).entries(1_100_000).createOrRecoverPersistedTo(mapFile); + } catch (IOException ex) { + Jvm.rethrow(ex); + } + } + + + private long counter = -WARM_UP_ITERATIONS; + private Datum datum = new Datum(); + @Override + public void run(long startTimeNS) { + long runNo = counter++; + datum.ts = startTimeNS; + long startWrite = System.nanoTime(); + write.put(runNo, datum); + long endWrite = System.nanoTime(); + long writeTime = endWrite - startWrite; + writeSampler.sampleNanos(writeTime); + + Datum dataRead = read.getUsing(runNo - 1, datum); + long nanos = System.nanoTime(); + if (dataRead != null) { + readSampler.sampleNanos(nanos - endWrite); + } + e2eSampler.sampleNanos(nanos - startTimeNS); + } + + @Override + public void warmedUp() { + counter = 0; + } + + @Override + public void complete() { + write.close(); + read.close(); + } + + private static class Datum implements BytesMarshallable { + public long ts = 0; + public byte[] filler = new byte[4088]; + + @Override + public void readMarshallable(BytesIn bytes) throws IORuntimeException { + ts = bytes.readLong(); + bytes.read(filler); + } + + @Override + public void writeMarshallable(BytesOut bytes) { + bytes.writeLong(ts); + bytes.write(filler); + } + } +} From 8cd960f25e7922fdc7347c543e726e4ebd23ebde Mon Sep 17 00:00:00 2001 From: Dmitry Pisklov Date: Tue, 6 Nov 2018 12:32:27 +0000 Subject: [PATCH 2/2] New DTO for #164 --- .../chronicle/map/perf/MapJLBHTest.java | 224 ++++++++++++++++-- 1 file changed, 199 insertions(+), 25 deletions(-) diff --git a/src/test/java/net/openhft/chronicle/map/perf/MapJLBHTest.java b/src/test/java/net/openhft/chronicle/map/perf/MapJLBHTest.java index e3fbaaa25..e2e31c501 100644 --- a/src/test/java/net/openhft/chronicle/map/perf/MapJLBHTest.java +++ b/src/test/java/net/openhft/chronicle/map/perf/MapJLBHTest.java @@ -17,11 +17,9 @@ */ package net.openhft.chronicle.map.perf; -import net.openhft.chronicle.bytes.BytesIn; -import net.openhft.chronicle.bytes.BytesMarshallable; -import net.openhft.chronicle.bytes.BytesOut; +import net.openhft.chronicle.bytes.Byteable; +import net.openhft.chronicle.bytes.NativeBytesStore; import net.openhft.chronicle.core.Jvm; -import net.openhft.chronicle.core.io.IORuntimeException; import net.openhft.chronicle.core.io.IOTools; import net.openhft.chronicle.core.jlbh.JLBH; import net.openhft.chronicle.core.jlbh.JLBHOptions; @@ -29,14 +27,17 @@ import net.openhft.chronicle.core.jlbh.JLBHTask; import net.openhft.chronicle.core.util.NanoSampler; import net.openhft.chronicle.map.ChronicleMap; import net.openhft.chronicle.map.ChronicleMapBuilder; +import net.openhft.chronicle.values.Array; +import net.openhft.chronicle.values.MaxUtf8Length; +import net.openhft.chronicle.values.Values; import java.io.File; import java.io.IOException; public class MapJLBHTest implements JLBHTask { private static final int WARM_UP_ITERATIONS = 40_000; - private ChronicleMap read; - private ChronicleMap write; + private ChronicleMap read; + private ChronicleMap write; private NanoSampler readSampler; private NanoSampler writeSampler; private NanoSampler e2eSampler; @@ -63,10 +64,13 @@ public class MapJLBHTest implements JLBHTask { writeSampler = jlbh.addProbe("Write"); e2eSampler = jlbh; - Datum sampleValue = new Datum(); + Byteable byteable = (Byteable) datum; + long capacity = byteable.maxSize(); + byteable.bytesStore(NativeBytesStore.nativeStore(capacity), 0, capacity); + try { - write = ChronicleMapBuilder.of(Long.class, Datum.class).constantValueSizeBySample(sampleValue).entries(1_100_000).createOrRecoverPersistedTo(mapFile); - read = ChronicleMapBuilder.of(Long.class, Datum.class).constantValueSizeBySample(sampleValue).entries(1_100_000).createOrRecoverPersistedTo(mapFile); + write = ChronicleMapBuilder.of(Long.class, IFacade.class).constantValueSizeBySample(datum).entries(1_100_000).createOrRecoverPersistedTo(mapFile); + read = ChronicleMapBuilder.of(Long.class, IFacade.class).constantValueSizeBySample(datum).entries(1_100_000).createOrRecoverPersistedTo(mapFile); } catch (IOException ex) { Jvm.rethrow(ex); } @@ -74,18 +78,17 @@ public class MapJLBHTest implements JLBHTask { private long counter = -WARM_UP_ITERATIONS; - private Datum datum = new Datum(); @Override public void run(long startTimeNS) { long runNo = counter++; - datum.ts = startTimeNS; + datum.setValue10(startTimeNS); long startWrite = System.nanoTime(); write.put(runNo, datum); long endWrite = System.nanoTime(); long writeTime = endWrite - startWrite; writeSampler.sampleNanos(writeTime); - Datum dataRead = read.getUsing(runNo - 1, datum); + IFacade dataRead = read.getUsing(runNo - 1, datum); long nanos = System.nanoTime(); if (dataRead != null) { readSampler.sampleNanos(nanos - endWrite); @@ -104,20 +107,191 @@ public class MapJLBHTest implements JLBHTask { read.close(); } - private static class Datum implements BytesMarshallable { - public long ts = 0; - public byte[] filler = new byte[4088]; + private IFacade datum = Values.newNativeReference(IFacade.class); - @Override - public void readMarshallable(BytesIn bytes) throws IORuntimeException { - ts = bytes.readLong(); - bytes.read(filler); - } + //IFacade (at the bottom) is the façade we need tested - @Override - public void writeMarshallable(BytesOut bytes) { - bytes.writeLong(ts); - bytes.write(filler); - } + interface IFacadeBase { + short getValue0(); void setValue0(short value); + byte getValue1(); void setValue1(byte value); + byte getValue2(); void setValue2(byte value); + int getValue3(); void setValue3(int value); + short getValue4(); void setValue4(short value); + boolean getValue5(); void setValue5(boolean value); + boolean getValue6(); void setValue6(boolean value); + short getValue7(); void setValue7(short value); + short getValue8(); void setValue8(short value); + long getValue9(); void setValue9(long value); + long getValue10(); void setValue10(long value); + long getValue11(); void setValue11(long value); + long getValue12(); void setValue12(long value); + long getValue13(); void setValue13(long value); + long getValue14(); void setValue14(long value); + long getValue15(); void setValue15(long value); + short getValue16(); void setValue16(short value); + short getValue17(); void setValue17(short value); + short getValue18(); void setValue18(short value); + } + + interface IFacadeSon extends IFacadeBase { + long getValue19(); void setValue19(long value); + int getValue20(); void setValue20(int value); + int getValue21(); void setValue21(int value); + double getValue22(); void setValue22(double value); + String getValue23(); void setValue23(@MaxUtf8Length(10) String value); + int getValue24(); void setValue24(int value); + double getValue25(); void setValue25(double value); + byte getValue26(); void setValue26(byte value); + double getValue27(); void setValue27(double value); + double getValue28(); void setValue28(double value); + double getValue29(); void setValue29(double value); + double getValue30(); void setValue30(double value); + double getValue31(); void setValue31(double value); + double getValue32(); void setValue32(double value); + } + + interface IFacadeDaughter extends IFacadeBase { + long getValue33(); void setValue33(long value); + String getValue34(); void setValue34(@MaxUtf8Length(11)String value); + int getValue35(); void setValue35(int value); + String getValue36(); void setValue36(@MaxUtf8Length(11)String value); + int getValue37(); void setValue37(int value); + long getValue38(); void setValue38(long value); + short getValue39(); void setValue39(short value); + long getValue40(); void setValue40(long value); + String getValue41(); void setValue41(@MaxUtf8Length(43)String value); + long getValue42(); void setValue42(long value); + long getValue43(); void setValue43(long value); + long getValue44(); void setValue44(long value); + long getValue45(); void setValue45(long value); + long getValue46(); void setValue46(long value); + byte getValue47(); void setValue47(byte value); + byte getValue48(); void setValue48(byte value); + double getValue49(); void setValue49(double value); + double getValue50(); void setValue50(double value); + double getValue51(); void setValue51(double value); + byte getValue52(); void setValue52(byte value); + byte getValue53(); void setValue53(byte value); + byte getValue54(); void setValue54(byte value); + byte getValue55(); void setValue55(byte value); + byte getValue56(); void setValue56(byte value); + long getValue57(); void setValue57(long value); + byte getValue58(); void setValue58(byte value); + double getValue59(); void setValue59(double value); + double getValue60(); void setValue60(double value); + double getValue61(); void setValue61(double value); + double getValue62(); void setValue62(double value); + double getValue63(); void setValue63(double value); + long getValue64(); void setValue64(long value); + long getValue65(); void setValue65(long value); + double getValue66(); void setValue66(double value); + double getValue67(); void setValue67(double value); + short getValue68(); void setValue68(short value); + String getValue69(); void setValue69(@MaxUtf8Length(101)String value); + String getValue70(); void setValue70(@MaxUtf8Length(17)String value); + boolean getValue71(); void setValue71(boolean value); + boolean getValue72(); void setValue72(boolean value); + String getValue73(); void setValue73(@MaxUtf8Length(11)String value); + String getValue74(); void setValue74(@MaxUtf8Length(9)String value); + byte getValue75(); void setValue75(byte value); + int getValue76(); void setValue76(int value); + int getValue77(); void setValue77(int value); + String getValue78(); void setValue78(@MaxUtf8Length(3)String value); + int getValue79(); void setValue79(int value); + double getValue80(); void setValue80(double value); + byte getValue81(); void setValue81(byte value); + byte getValue82(); void setValue82(byte value); + byte getValue83(); void setValue83(byte value); + byte getValue84(); void setValue84(byte value); + byte getValue85(); void setValue85(byte value); + byte getValue86(); void setValue86(byte value); + byte getValue87(); void setValue87(byte value); + byte getValue88(); void setValue88(byte value); + int getValue89(); void setValue89(int value); + int getValue90(); void setValue90(int value); + int getValue91(); void setValue91(int value); + int getValue92(); void setValue92(int value); + int getValue93(); void setValue93(int value); + int getValue94(); void setValue94(int value); + int getValue95(); void setValue95(int value); + int getValue96(); void setValue96(int value); + int getValue97(); void setValue97(int value); + int getValue98(); void setValue98(int value); + int getValue99(); void setValue99(int value); + int getValue100(); void setValue100(int value); + int getValue101(); void setValue101(int value); + int getValue102(); void setValue102(int value); + int getValue103(); void setValue103(int value); + int getValue104(); void setValue104(int value); + double getValue105(); void setValue105(double value); + double getValue106(); void setValue106(double value); + long getValue107(); void setValue107(long value); + long getValue108(); void setValue108(long value); + long getValue109(); void setValue109(long value); + byte getValue110(); void setValue110(byte value); + byte getValue111(); void setValue111(byte value); + byte getValue112(); void setValue112(byte value); + byte getValue113(); void setValue113(byte value); + byte getValue114(); void setValue114(byte value); + byte getValue115(); void setValue115(byte value); + byte getValue116(); void setValue116(byte value); + byte getValue117(); void setValue117(byte value); + byte getValue118(); void setValue118(byte value); + byte getValue119(); void setValue119(byte value); + byte getValue120(); void setValue120(byte value); + byte getValue121(); void setValue121(byte value); + byte getValue122(); void setValue122(byte value); + byte getValue123(); void setValue123(byte value); + byte getValue124(); void setValue124(byte value); + byte getValue125(); void setValue125(byte value); + int getValue126(); void setValue126(int value); + int getValue127(); void setValue127(int value); + int getValue128(); void setValue128(int value); + int getValue129(); void setValue129(int value); + int getValue130(); void setValue130(int value); + int getValue131(); void setValue131(int value); + int getValue132(); void setValue132(int value); + int getValue133(); void setValue133(int value); + int getValue134(); void setValue134(int value); + int getValue135(); void setValue135(int value); + int getValue136(); void setValue136(int value); + int getValue137(); void setValue137(int value); + int getValue138(); void setValue138(int value); + int getValue139(); void setValue139(int value); + int getValue140(); void setValue140(int value); + int getValue141(); void setValue141(int value); + double getValue142(); void setValue142(double value); + double getValue143(); void setValue143(double value); + byte getValue144(); void setValue144(byte value); + String getValue145(); void setValue145(@MaxUtf8Length(3)String value); + short getValue146(); void setValue146(short value); + byte getValue147(); void setValue147(byte value); + byte getValue148(); void setValue148(byte value); + int getValue149(); void setValue149(int value); + short getValue150(); void setValue150(short value); + boolean getValue151(); void setValue151(boolean value); + boolean getValue152(); void setValue152(boolean value); + short getValue153(); void setValue153(short value); + short getValue154(); void setValue154(short value); + long getValue155(); void setValue155(long value); + long getValue156(); void setValue156(long value); + long getValue157(); void setValue157(long value); + long getValue158(); void setValue158(long value); + long getValue159(); void setValue159(long value); + long getValue160(); void setValue160(long value); + long getValue161(); void setValue161(long value); + short getValue162(); void setValue162(short value); + short getValue163(); void setValue163(short value); + short getValue164(); void setValue164(short value); + + } + + interface IFacade extends IFacadeBase { + @Array(length=3) + void setDaughterAt(int idx, IFacadeDaughter daughter); + IFacadeDaughter getDaughterAt(int idx); + @Array(length=3) + void setSonAt(int idx, IFacadeSon son); + IFacadeSon getSonAt(int idx); } }