blob: 40d0480942aa7203f6ec00b1db89309b51a4891b [file] [log] [blame]
/**
* 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);
}
}