blob: 35515c82a534350d783f2f66f98caf990967b56c [file] [log] [blame]
Jake Farrellb95b0ff2012-03-22 21:49:10 +00001/**
2 * An implementation of the mini serialization benchmark also available for
3 * C++ and Java.
4 *
5 * For meaningful results, you might want to make sure that
6 * the Thrift library is compiled with release build flags,
7 * e.g. by including the source files with the build instead
8 * of linking libthriftd:
9 *
10 dmd -w -O -release -inline -I../src -Igen-d -ofserialization_benchmark \
11 $(find ../src/thrift -name '*.d' -not -name index.d) \
12 gen-d/DebugProtoTest_types.d serialization_benchmark.d
13 */
14module serialization_benchmark;
15
16import std.datetime : AutoStart, StopWatch;
17import std.math : PI;
18import std.stdio;
19import thrift.protocol.binary;
20import thrift.transport.memory;
21import thrift.transport.range;
22import DebugProtoTest_types;
23
24void main() {
25 auto buf = new TMemoryBuffer;
26 enum ITERATIONS = 10_000_000;
27
28 {
29 auto ooe = OneOfEach();
30 ooe.im_true = true;
31 ooe.im_false = false;
32 ooe.a_bite = 0x7f;
33 ooe.integer16 = 27_000;
34 ooe.integer32 = 1 << 24;
35 ooe.integer64 = 6_000_000_000;
36 ooe.double_precision = PI;
37 ooe.some_characters = "JSON THIS! \"\1";
38 ooe.zomg_unicode = "\xd7\n\a\t";
39 ooe.base64 = "\1\2\3\255";
40
41 auto prot = tBinaryProtocol(buf);
42 auto sw = StopWatch(AutoStart.yes);
43 foreach (i; 0 .. ITERATIONS) {
44 buf.reset(120);
45 ooe.write(prot);
46 }
47 sw.stop();
48
49 auto msecs = sw.peek().msecs;
50 writefln("Write: %s ms (%s kHz)", msecs, ITERATIONS / msecs);
51 }
52
53 auto data = buf.getContents().dup;
54
55 {
56 auto readBuf = tInputRangeTransport(data);
57 auto prot = tBinaryProtocol(readBuf);
58 auto ooe = OneOfEach();
59
60 auto sw = StopWatch(AutoStart.yes);
61 foreach (i; 0 .. ITERATIONS) {
62 readBuf.reset(data);
63 ooe.read(prot);
64 }
65 sw.stop();
66
67 auto msecs = sw.peek().msecs;
68 writefln(" Read: %s ms (%s kHz)", msecs, ITERATIONS / msecs);
69 }
70}