| /** |
| * An implementation of the mini serialization benchmark also available for |
| * C++ and Java. |
| * |
| * For meaningful results, you might want to make sure that |
| * the Thrift library is compiled with release build flags, |
| * e.g. by including the source files with the build instead |
| * of linking libthriftd: |
| * |
| dmd -w -O -release -inline -I../src -Igen-d -ofserialization_benchmark \ |
| $(find ../src/thrift -name '*.d' -not -name index.d) \ |
| gen-d/DebugProtoTest_types.d serialization_benchmark.d |
| */ |
| module serialization_benchmark; |
| |
| import std.datetime.stopwatch : AutoStart, StopWatch; |
| import std.math : PI; |
| import std.stdio; |
| import thrift.protocol.binary; |
| import thrift.transport.memory; |
| import thrift.transport.range; |
| import DebugProtoTest_types; |
| |
| void main() { |
| auto buf = new TMemoryBuffer; |
| enum ITERATIONS = 10_000_000; |
| |
| { |
| auto ooe = OneOfEach(); |
| ooe.im_true = true; |
| ooe.im_false = false; |
| ooe.a_bite = 0x7f; |
| ooe.integer16 = 27_000; |
| ooe.integer32 = 1 << 24; |
| ooe.integer64 = 6_000_000_000; |
| ooe.double_precision = PI; |
| ooe.some_characters = "JSON THIS! \"\1"; |
| ooe.zomg_unicode = "\xd7\n\a\t"; |
| ooe.base64 = "\1\2\3\255"; |
| |
| auto prot = tBinaryProtocol(buf); |
| auto sw = StopWatch(AutoStart.yes); |
| foreach (i; 0 .. ITERATIONS) { |
| buf.reset(120); |
| ooe.write(prot); |
| } |
| sw.stop(); |
| |
| auto msecs = sw.peek().total!"msecs"; |
| writefln("Write: %s ms (%s kHz)", msecs, ITERATIONS / msecs); |
| } |
| |
| auto data = buf.getContents().dup; |
| |
| { |
| auto readBuf = tInputRangeTransport(data); |
| auto prot = tBinaryProtocol(readBuf); |
| auto ooe = OneOfEach(); |
| |
| auto sw = StopWatch(AutoStart.yes); |
| foreach (i; 0 .. ITERATIONS) { |
| readBuf.reset(data); |
| ooe.read(prot); |
| } |
| sw.stop(); |
| |
| auto msecs = sw.peek().total!"msecs"; |
| writefln(" Read: %s ms (%s kHz)", msecs, ITERATIONS / msecs); |
| } |
| } |