Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: drupanchal/Java-Chronicle
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: master
Choose a base ref
...
head repository: peter-lawrey/Java-Chronicle
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: master
Choose a head ref
Able to merge. These branches can be automatically merged.
Loading
Showing with 25,103 additions and 2,554 deletions.
  1. +2 −0 .gitignore
  2. +9 −0 .idea/copyright/Apache_2_0.xml
  3. +0 −89 README
  4. +197 −0 README.md
  5. +50 −0 chronicle-fix/pom.xml
  6. +29 −0 chronicle-fix/src/main/java/com/higherfrequencytrading/chronicle/fix/FixDecodeListener.java
  7. +61 −0 chronicle-fix/src/main/java/com/higherfrequencytrading/chronicle/fix/FixDecoder.java
  8. +276 −0 chronicle-fix/src/main/java/com/higherfrequencytrading/chronicle/fix/FixParserGeneratorMain.java
  9. +105 −0 chronicle-fix/src/main/java/com/higherfrequencytrading/chronicle/fix/FixSocketReader.java
  10. +6,800 −0 chronicle-fix/src/main/resources/FIX44.xml
  11. +217 −0 chronicle-fix/src/test/java/com/higherfrequencytrading/chronicle/fix/FixSocketReaderTest.java
  12. +161 −0 chronicle/pom.xml
  13. +32 −6 ...illa/java → chronicle/src/main/java/com/higherfrequencytrading}/chronicle/ByteStringAppender.java
  14. +57 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/ByteStringParser.java
  15. +37 −3 .../java/vanilla/java → chronicle/src/main/java/com/higherfrequencytrading}/chronicle/Chronicle.java
  16. +36 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/EnumeratedMarshaller.java
  17. +45 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/EventListener.java
  18. +228 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/Excerpt.java
  19. +5 −6 ...hronicle/tcp → chronicle/src/main/java/com/higherfrequencytrading/chronicle}/ExcerptListener.java
  20. +39 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/ExcerptMarshallable.java
  21. +70 −14 ...vanilla/java → chronicle/src/main/java/com/higherfrequencytrading}/chronicle/RandomDataInput.java
  22. +33 −12 ...anilla/java → chronicle/src/main/java/com/higherfrequencytrading}/chronicle/RandomDataOutput.java
  23. +24 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/StopCharTester.java
  24. +76 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/StopCharTesters.java
  25. +46 −0 ...icle/src/main/java/com/higherfrequencytrading/chronicle/datamodel/AbstractCollectionListener.java
  26. +38 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/datamodel/AbstractListListener.java
  27. +51 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/datamodel/AbstractMapListener.java
  28. +28 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/datamodel/CollectionListener.java
  29. +267 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/datamodel/DataStore.java
  30. +111 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/datamodel/DataStoreSet.java
  31. +28 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/datamodel/ListListener.java
  32. +710 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/datamodel/ListWrapper.java
  33. +32 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/datamodel/MapListener.java
  34. +436 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/datamodel/MapWrapper.java
  35. +36 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/datamodel/MasterContext.java
  36. +7 −16 ...icle.java → chronicle/src/main/java/com/higherfrequencytrading/chronicle/datamodel/ModelMode.java
  37. +33 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/datamodel/MyAnnotation.java
  38. +33 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/datamodel/ObservableCollection.java
  39. +28 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/datamodel/ObservableList.java
  40. +28 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/datamodel/ObservableMap.java
  41. +25 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/datamodel/ObservableSet.java
  42. +23 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/datamodel/SetListener.java
  43. +466 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/datamodel/SetWrapper.java
  44. +56 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/datamodel/Wrapper.java
  45. +24 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/datamodel/WrapperEvent.java
  46. +116 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/impl/AbstractChronicle.java
  47. +2,145 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/impl/AbstractExcerpt.java
  48. +52 −6 .../java → chronicle/src/main/java/com/higherfrequencytrading}/chronicle/impl/ByteBufferExcerpt.java
  49. +55 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/impl/BytesMarshaller.java
  50. +110 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/impl/ChronicleBuilder.java
  51. +111 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/impl/ClassEnumMarshaller.java
  52. +103 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/impl/DateMarshaller.java
  53. +17 −8 ...la/java → chronicle/src/main/java/com/higherfrequencytrading}/chronicle/impl/DirectChronicle.java
  54. +33 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/impl/ExcerptComparator.java
  55. +72 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/impl/ExcerptMarshaller.java
  56. +71 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/impl/ExternalizableMarshaller.java
  57. +107 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/impl/GenericEnumMarshaller.java
  58. +260 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/impl/IndexedChronicle.java
  59. +21 −10 ...ava → chronicle/src/main/java/com/higherfrequencytrading}/chronicle/impl/IntIndexedChronicle.java
  60. +146 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/impl/MappedFile.java
  61. +83 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/impl/MappedMemory.java
  62. +73 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/impl/StringInterner.java
  63. +66 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/impl/StringMarshaller.java
  64. +58 −21 ...illa/java → chronicle/src/main/java/com/higherfrequencytrading}/chronicle/impl/UnsafeExcerpt.java
  65. +104 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/impl/VanillaEnumMarshaller.java
  66. +746 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/impl/WrappedExcerpt.java
  67. +206 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/math/MutableDecimal.java
  68. +197 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/tcp/ChronicleSink.java
  69. +56 −45 ...lla/java → chronicle/src/main/java/com/higherfrequencytrading}/chronicle/tcp/ChronicleSource.java
  70. +260 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/tcp/InProcessChronicleSink.java
  71. +295 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/tcp/InProcessChronicleSource.java
  72. +6 −3 .../java → chronicle/src/main/java/com/higherfrequencytrading}/chronicle/tcp/NamedThreadFactory.java
  73. +32 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/tcp/NullExcerptListener.java
  74. +6 −7 ...ava/vanilla/java → chronicle/src/main/java/com/higherfrequencytrading}/chronicle/tcp/TcpUtil.java
  75. +48 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/tcp/gw/GatewayEntryReader.java
  76. +65 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/tcp/gw/GatewayEntryWriter.java
  77. +171 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/tcp/gw/SocketGateway.java
  78. +23 −5 ...a/java → chronicle/src/main/java/com/higherfrequencytrading}/chronicle/tools/ChronicleReader.java
  79. +147 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/tools/ChronicleTools.java
  80. +143 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/tools/ConfigProperties.java
  81. +141 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/tools/IOTools.java
  82. +28 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/tools/WaitingRunnable.java
  83. +108 −0 chronicle/src/main/java/com/higherfrequencytrading/chronicle/tools/WaitingThread.java
  84. +143 −0 chronicle/src/test/java/com/higherfrequencytrading/chronicle/datamodel/DataStoreTest.java
  85. +85 −0 chronicle/src/test/java/com/higherfrequencytrading/chronicle/datamodel/ExampleDataModel.java
  86. +178 −0 chronicle/src/test/java/com/higherfrequencytrading/chronicle/datamodel/ListWrapperTest.java
  87. +444 −0 chronicle/src/test/java/com/higherfrequencytrading/chronicle/datamodel/MapWrapperTest.java
  88. +175 −0 chronicle/src/test/java/com/higherfrequencytrading/chronicle/datamodel/SetWrapperTest.java
  89. +115 −0 chronicle/src/test/java/com/higherfrequencytrading/chronicle/examples/ExampleKeyedExcerptMain.java
  90. +96 −0 chronicle/src/test/java/com/higherfrequencytrading/chronicle/examples/ExampleRewriteMain.java
  91. +496 −0 ...nicle/src/test/java/com/higherfrequencytrading/chronicle/examples/ExampleSimpleWriteReadMain.java
  92. +44 −0 chronicle/src/test/java/com/higherfrequencytrading/chronicle/examples/TestManyUpdatesMain.java
  93. +32 −0 chronicle/src/test/java/com/higherfrequencytrading/chronicle/impl/AccessMode.java
  94. +127 −0 chronicle/src/test/java/com/higherfrequencytrading/chronicle/impl/AppendParseTest.java
  95. +43 −32 ...a → chronicle/src/test/java/com/higherfrequencytrading}/chronicle/impl/ByteBufferExcerptTest.java
  96. +69 −0 chronicle/src/test/java/com/higherfrequencytrading/chronicle/impl/ChainedInProcessChronicleTest.java
  97. +92 −0 chronicle/src/test/java/com/higherfrequencytrading/chronicle/impl/ExcerptHasNextTest.java
  98. +76 −0 chronicle/src/test/java/com/higherfrequencytrading/chronicle/impl/GenerateAppendMain.java
  99. +258 −0 chronicle/src/test/java/com/higherfrequencytrading/chronicle/impl/InProcessChronicleTest.java
  100. +422 −0 chronicle/src/test/java/com/higherfrequencytrading/chronicle/impl/IndexedChronicleTest.java
  101. +4 −4 ...→ chronicle/src/test/java/com/higherfrequencytrading}/chronicle/impl/IntIndexedChronicleTest.java
  102. +121 −0 chronicle/src/test/java/com/higherfrequencytrading/chronicle/impl/NewNumberAppendTest.java
  103. +72 −0 chronicle/src/test/java/com/higherfrequencytrading/chronicle/math/MutableDecimalTest.java
  104. +48 −0 chronicle/src/test/java/com/higherfrequencytrading/chronicle/tools/ChronicleToolsTest.java
  105. +102 −0 chronicle/src/test/java/com/higherfrequencytrading/db/DataStorePerfTest.java
  106. +47 −0 demo/pom.xml
  107. +126 −0 demo/src/main/java/vanilla/java/processingengine/GWMain.java
  108. +89 −0 demo/src/main/java/vanilla/java/processingengine/PEMain.java
  109. +24 −0 demo/src/main/java/vanilla/java/processingengine/api/Gw2PeEvents.java
  110. +65 −0 demo/src/main/java/vanilla/java/processingengine/api/Gw2PeReader.java
  111. +42 −0 demo/src/main/java/vanilla/java/processingengine/api/Gw2PeWriter.java
  112. +24 −0 demo/src/main/java/vanilla/java/processingengine/api/MessageType.java
  113. +84 −0 demo/src/main/java/vanilla/java/processingengine/api/MetaData.java
  114. +26 −0 demo/src/main/java/vanilla/java/processingengine/api/Pe2GwEvents.java
  115. +61 −0 demo/src/main/java/vanilla/java/processingengine/api/Pe2GwReader.java
  116. +40 −0 demo/src/main/java/vanilla/java/processingengine/api/Pe2GwWriter.java
  117. +24 −0 demo/src/main/java/vanilla/java/processingengine/api/ReportStatus.java
  118. +24 −0 demo/src/main/java/vanilla/java/processingengine/api/Side.java
  119. +52 −0 demo/src/main/java/vanilla/java/processingengine/api/SmallCommand.java
  120. +58 −0 demo/src/main/java/vanilla/java/processingengine/api/SmallReport.java
  121. +65 −0 demo/src/main/java/vanilla/java/processingengine/testing/Histogram.java
  122. +47 −0 demo2/pom.xml
  123. +109 −0 demo2/src/main/java/vanilla/java/stages/EngineMain.java
  124. +11 −0 demo2/src/main/java/vanilla/java/stages/README.txt
  125. +154 −0 demo2/src/main/java/vanilla/java/stages/SinkMain.java
  126. +81 −0 demo2/src/main/java/vanilla/java/stages/SourceMain.java
  127. +26 −0 demo2/src/main/java/vanilla/java/stages/api/Events.java
  128. +52 −0 demo2/src/main/java/vanilla/java/stages/api/EventsReader.java
  129. +48 −0 demo2/src/main/java/vanilla/java/stages/api/EventsWriter.java
  130. +26 −0 demo2/src/main/java/vanilla/java/stages/api/MessageType.java
  131. +89 −0 demo2/src/main/java/vanilla/java/stages/api/MetaData.java
  132. +31 −0 demo2/src/main/java/vanilla/java/stages/api/TimingStage.java
  133. +62 −0 demo2/src/main/java/vanilla/java/stages/api/Update.java
  134. +65 −0 demo2/src/main/java/vanilla/java/stages/api/UpdateLevel.java
  135. +26 −0 demo2/src/main/java/vanilla/java/stages/testing/Differencer.java
  136. +56 −0 demo2/src/main/java/vanilla/java/stages/testing/RunningMinimum.java
  137. +29 −0 demo2/src/main/java/vanilla/java/stages/testing/VanillaDifferencer.java
  138. +36 −0 hiccup/pom.xml
  139. +215 −0 hiccup/src/main/java/com/higherfrequencytrading/hiccup/ChronicleTcpHiccupMain.java
  140. +123 −0 hiccup/src/main/java/com/higherfrequencytrading/hiccup/Histogram.java
  141. +150 −0 hiccup/src/main/java/com/higherfrequencytrading/hiccup/JavaSerializationHiccupMain.java
  142. +256 −0 hiccup/src/main/java/com/higherfrequencytrading/hiccup/TcpHiccupMain.java
  143. +97 −19 pom.xml
  144. BIN repository/vanilla/java/affinity/1.6/affinity-1.6-sources.jar
  145. BIN repository/vanilla/java/affinity/1.6/affinity-1.6.jar
  146. +0 −227 repository/vanilla/java/affinity/1.6/affinity-1.6.pom
  147. +0 −12 repository/vanilla/java/affinity/maven-metadata-local.xml
  148. BIN repository/vanilla/java/chronicle/1.0/chronicle-1.0-sources.jar
  149. BIN repository/vanilla/java/chronicle/1.0/chronicle-1.0.jar
  150. +0 −70 repository/vanilla/java/chronicle/1.0/chronicle-1.0.pom
  151. +0 −12 repository/vanilla/java/chronicle/maven-metadata-local.xml
  152. +0 −98 src/main/java/vanilla/java/chronicle/ByteString.java
  153. +0 −99 src/main/java/vanilla/java/chronicle/Excerpt.java
  154. +0 −1,141 src/main/java/vanilla/java/chronicle/impl/AbstractExcerpt.java
  155. +0 −226 src/main/java/vanilla/java/chronicle/impl/IndexedChronicle.java
  156. +0 −152 src/main/java/vanilla/java/chronicle/tcp/ChronicleSink.java
  157. +0 −14 src/main/java/vanilla/java/chronicle/tcp/NullExcerptListener.java
  158. +0 −76 src/test/java/vanilla/java/chronicle/impl/IndexedChronicleTest.java
  159. +12 −12 testing/pom.xml
  160. +52 −0 testing/src/main/java/com/higherfrequencytrading/chronicle/example/JETest.java
  161. +25 −14 ...a/{vanilla/java → com/higherfrequencytrading}/chronicle/impl/BaseIndexedChronicleLatencyMain.java
  162. +24 −19 ...vanilla/java → com/higherfrequencytrading}/chronicle/impl/BaseIndexedChronicleThroughputMain.java
  163. +12 −13 ...ing/src/main/java/{vanilla/java → com/higherfrequencytrading}/chronicle/impl/FileLoggingMain.java
  164. +3 −3 testing/src/main/java/{vanilla/java → com/higherfrequencytrading}/chronicle/impl/GlobalSettings.java
  165. +30 −18 .../java/{vanilla/java → com/higherfrequencytrading}/chronicle/impl/IndexedChronicleLatencyMain.java
  166. +23 −17 ...va/{vanilla/java → com/higherfrequencytrading}/chronicle/impl/IndexedChronicleThroughputMain.java
  167. +16 −14 ...{vanilla/java → com/higherfrequencytrading}/chronicle/impl/IntIndexedChronicleThroughputMain.java
  168. +18 −2 ...src/main/java/{vanilla/java → com/higherfrequencytrading}/chronicle/impl/KillPerformanceMain.java
  169. +93 −0 testing/src/main/java/com/higherfrequencytrading/chronicle/impl/ReadWriteUTFTest.java
  170. +183 −0 testing/src/main/java/com/higherfrequencytrading/chronicle/perf/DecodeFIXMessages.java
  171. +143 −0 testing/src/main/java/com/higherfrequencytrading/chronicle/perf/PackedHashedTable.java
  172. +259 −0 testing/src/main/java/com/higherfrequencytrading/chronicle/perf/PackedHashedTableTest.java
  173. +22 −6 ...g/src/main/java/{vanilla/java → com/higherfrequencytrading}/chronicle/tools/ObjectStreamTest.java
  174. +76 −0 testing/src/main/java/com/higherfrequencytrading/stringipc/DirectMemoryReader.java
  175. +57 −0 testing/src/main/java/com/higherfrequencytrading/stringipc/DirectMemoryWriter.java
  176. +17 −3 testing/src/main/java/{vanilla/java → com/higherfrequencytrading}/testing/Histogram.java
  177. +43 −0 testing/src/main/java/data/ReprUtil.java
  178. +155 −0 testing/src/main/java/data/media/Image.java
  179. +271 −0 testing/src/main/java/data/media/Media.java
  180. +111 −0 testing/src/main/java/data/media/MediaContent.java
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.idea
*.iml
9 changes: 9 additions & 0 deletions .idea/copyright/Apache_2_0.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

89 changes: 0 additions & 89 deletions README

This file was deleted.

197 changes: 197 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
# NOTE
This repo is old and out of date. I suggest you use version 3.x from https://github.com/OpenHFT/Chronicle-Queue

#Chronicle
This library is an ultra low latency, high throughput, persisted, messaging and event driven in memory database. The typical latency is as low as 80 nano-seconds and supports throughputs of 5-20 million messages/record updates per second.

This library also supports distributed, durable, observable collections (Map, List, Set) The performance depends on the data structures used, but simple data structures can achieve throughputs of 5 million elements or key/value pairs in batches (eg addAll or putAll) and 500K elements or key/values per second when added/updated/removed individually.

It uses almost no heap, trivial GC impact, can be much larger than your physical memory size (only limited by the size of your disk) and can be shared *between processes* with better than 1/10th latency of using Sockets over loopback.
It can change the way you design your system because it allows you to have independent processes which can be running or not at the same time (as no messages are lost) This is useful for restarting services and testing your services from canned data. e.g. like sub-microsecond durable messaging.
You can attach any number of readers, including tools to see the exact state of the data externally. e.g. I use; od -t cx1 {file} to see the current state.

#Example
```java
public static void main(String... ignored) throws IOException {
final String basePath = System.getProperty("java.io.tmpdir") + File.separator + "test";
ChronicleTools.deleteOnExit(basePath);
final int[] consolidates = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
final int warmup = 500000;
final int repeats = 20000000;
//Write
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
final IndexedChronicle chronicle = new IndexedChronicle(basePath);
chronicle.useUnsafe(true); // for benchmarks.
final Excerpt excerpt = chronicle.createExcerpt();
for (int i = -warmup; i < repeats; i++) {
doSomeThinking();
excerpt.startExcerpt(8 + 4 + 4 * consolidates.length);
excerpt.writeLong(System.nanoTime());
excerpt.writeUnsignedShort(consolidates.length);
for (final int consolidate : consolidates) {
excerpt.writeStopBit(consolidate);
}
excerpt.finish();
}
chronicle.close();
} catch (Exception e) {
e.printStackTrace();
}
}

private void doSomeThinking() {
// real programs do some work between messages
// this has an impact on the worst case latencies.
Thread.yield();
}
});
t.start();
//Read
final IndexedChronicle chronicle = new IndexedChronicle(basePath);
chronicle.useUnsafe(true); // for benchmarks.
final Excerpt excerpt = chronicle.createExcerpt();
int[] times = new int[repeats];
for (int count = -warmup; count < repeats; count++) {
while (!excerpt.nextIndex()) {
/* busy wait */
}
final long timestamp = excerpt.readLong();
long time = System.nanoTime() - timestamp;
if (count >= 0)
times[count] = (int) time;
final int nbConsolidates = excerpt.readUnsignedShort();
assert nbConsolidates == consolidates.length;
for (int i = 0; i < nbConsolidates; i++) {
excerpt.readStopBit();
}
excerpt.finish();
}
Arrays.sort(times);
for (double perc : new double[]{50, 90, 99, 99.9, 99.99}) {
System.out.printf("%s%% took %.1f µs, ", perc, times[((int) (repeats * perc / 100))] / 1000.0);
}
System.out.printf("worst took %d µs%n", times[times.length - 1] / 1000);
chronicle.close();
}
```
prints an output like (note: this test does 20 million in a matter of seconds and the first half a million is for warming up)

```
50.0% took 0.3 µs, 90.0% took 0.4 µs, 99.0% took 33.5 µs, 99.9% took 66.9 µs, 99.99% took 119.7 µs, worst took 183 µs
50.0% took 0.4 µs, 90.0% took 0.5 µs, 99.0% took 0.6 µs, 99.9% took 9.3 µs, 99.99% took 60.1 µs, worst took 883 µs
50.0% took 0.3 µs, 90.0% took 0.4 µs, 99.0% took 0.6 µs, 99.9% took 21.9 µs, 99.99% took 62.0 µs, worst took 234 µs
50.0% took 0.3 µs, 90.0% took 0.4 µs, 99.0% took 0.6 µs, 99.9% took 9.3 µs, 99.99% took 55.8 µs, worst took 199 µs
```

#Support Group
https://groups.google.com/forum/?fromgroups#!forum/java-chronicle

#Software used to Develop this package
YourKit 11.x - http://www.yourkit.com - If you don't profile the performance of your application, you are just guessing where the performance bottlenecks are.

IntelliJ CE - http://www.jetbrains.com - My favourite IDE.


#Version History

Version 1.8 - Add MutableDecimal and FIX support.

Version 1.7.1 - Bug fix and OGSi support.
Sonar and IntelliJ code analysis - thank you, Mani.
Add appendDate and appendDateTime
Improved performance for appendLong and appendDouble (Thank you Andrew Bissell)

Version 1.7 - Add support to the DataModel for arbitrary events to be sent such as timestamps, heartbeats, changes in stages which can picked up by listeners.
Add support for the DataModel for arbitrary annotations on the data so each map/collection can have additional configuration
Add ConfigProperties which is scoped properties i.e. a single Properties file with a rule based properties.

Version 1.6 - Distributed, durable, observable collections, List, Set and Map.
Efficient serialization of Java objects. Java Serialization provided for compatibility but use of Externalizable preferred.
Minimisation of virtual memory for 32-bit platforms.

Version 1.5 - Publishing Chronicle over TCP.
Note: the package has changed to com.higherfrequencytrading to support publishing to maven central.

Version 1.4 - Reading/writing enumerated types, Enum and generic.
Improve replication performance and memory usage (esp for large excerpts)
Removed the requirement to provide a DataSizeBitsHint when it wasn't clear what this was for.
Add ChronicleTest to support testing.
Add support for parsing text to compliment existing appending of text.

Version 1.3 - Minor improvements.

Version 1.2 - Fixed a bug in the handling of writeBoolean.

Version 1.1 - Add support for OutputStream and InputStream required by ObjectOutputStream and ObjectInputStream. Using Java Serialization is not suggested as its relatively slow, but sometimes its your only option. ;)

Version 1.0 - First formal release available in https://github.com/peter-lawrey/Java-Chronicle/tree/master/repository

Version 0.5.1 - Fix code to compile with Java 6 update 31. (Previously only Java 7 was used)

Version 0.5 - Add support for replication of a Chronicle over TCP to any number of listeners, either as a component or stand alone/independent application. Uses ChronicleSource and ChronicleSink.
Add ChronicleReader to read records as they are added as text. (like less)

Version 0.4 - Add support for writing text to the log file without creating garbage via com.higherfrequencytrading.chronicle.ByteStringAppender interface. Useful for text logs.

Version 0.3.1 - Add support for 24-bit int and 48-bit long values.

Version 0.3 - Add support for unsigned byte, short and int. Add support for compacted short, unsigned short, int, unsigned int, long and double types. (Type will use half the size for small values otherwise 50% more)

Version 0.2 - Add support for a 32-bit unsigned index. IntIndexedChronicle. This is slightly slower on a 64-bit JVM, but more compact. Useful if you don't need more than 4 GB of data.

Version 0.1 - Can read/write all basic data types. 26 M/second (max) multi-threaded.

It uses memory mapped file to store "excerpts" of a "chronicle" Initially it only supports an indexed array of data.

#Performance

###Throughput Test - FileLoggingMain
https://github.com/peter-lawrey/Java-Chronicle/blob/master/testing/src/main/java/com/higherfrequencytrading/chronicle/impl/FileLoggingMain.java

This test logs one million lines of text using Chronicle compared with Logger.

To log 1,000,000 messages took 0.234 seconds using Chronicle and 7.347 seconds using Logger

###Throughput Test - IndexedChronicleThroughputMain

Note: These timings include Serialization. This is important because many performance tests don't include Serialization even though it can be many times slower than the data store they are testing.

https://github.com/peter-lawrey/Java-Chronicle/blob/master/testing/src/main/java/com/higherfrequencytrading/chronicle/impl/IndexedChronicleLatencyMain.java

On a 4.6 GHz, i7-2600, 16 GB of memory, Fast SSD drive. Centos 5.7.

The average RTT latency was 175 ns. The 50/99 / 99.9/99.99%tile latencies were 160/190 / 2,870/3,610 - ByteBuffer (tmpfs)
The average RTT latency was 172 ns. The 50/99 / 99.9/99.99%tile latencies were 160/190 / 2,780/3,520 - Using Unsafe (tmpfs)

The average RTT latency was 180 ns. The 50/99 / 99.9/99.99%tile latencies were 160/190 / 3,110/19,110 - ByteBuffer (ext4)
The average RTT latency was 178 ns. The 50/99 / 99.9/99.99%tile latencies were 160/190 / 3,100/19,090- Using Unsafe (ext4)

https://github.com/peter-lawrey/Java-Chronicle/blob/master/testing/src/main/java/com/higherfrequencytrading/chronicle/impl/IndexedChronicleThroughputMain.java

On a 4.6 GHz, i7-2600, 16 GB of memory, Fast SSD drive. Centos 5.7.

Took 12.416 seconds to write/read 200,000,000 entries, rate was 16.1 M entries/sec - ByteBuffer (tmpfs)
Took 9.185 seconds to write/read 200,000,000 entries, rate was 21.8 M entries/sec - Using Unsafe (tmpfs)

Took 25.693 seconds to write/read 400,000,000 entries, rate was 15.6 M entries/sec - ByteBuffer (ext4)
Took 19.522 seconds to write/read 400,000,000 entries, rate was 20.5 M entries/sec - Using Unsafe (ext4)

Took 71.458 seconds to write/read 1,000,000,000 entries, rate was 14.0 M entries/sec - Using Unsafe (ext4)
Took 141.424 seconds to write/read 2,000,000,000 entries, rate was 14.1 M entries/sec - Using Unsafe (ext4)

Note: in the last test, it is using 112 GB! of dense virtual memory in Java without showing a dramatic slow down or performance hit.

The 14.1 M entries/sec is close to the maximum write speed of the SSD as each entry is an average of 28 bytes (with the index) => ~ 400 MB/s

### More compact Index for less than 4 GB of data
https://github.com/peter-lawrey/Java-Chronicle/blob/master/testing/src/main/java/com/higherfrequencytrading/chronicle/impl/IntIndexedChronicleThroughputMain.java

on a 4.6 GHz, i7-2600
Took 6.325 seconds to write/read 100,000,000 entries, rate was 15.8 M entries/sec - ByteBuffer (tmpfs)
Took 4.590 seconds to write/read 100,000,000 entries, rate was 21.8 M entries/sec - Using Unsafe (tmpfs)

Took 7.352 seconds to write/read 100,000,000 entries, rate was 13.6 M entries/sec - ByteBuffer (ext4)
Took 5.283 seconds to write/read 100,000,000 entries, rate was 18.9 M entries/sec - Using Unsafe (ext4)
Loading