nlib
msgpack/msgpack2/msgpack2.cpp

This sample directly reads a static type with MessagePack. The data can be directly read and written at high speeds without using MpObject. This is possible when the data type is completely known, and higher performance is needed.

The sample performs the following operations.

The source code of the sample is shown below.

#include <vector>
using nlib_ns::msgpack::MpObject;
using nlib_ns::msgpack::MpReader;
using nlib_ns::msgpack::MpReaderSettings;
using nlib_ns::msgpack::MpWriter;
#ifndef VECSIZE
#define VECSIZE (1000000)
#endif
void SetupVector(std::vector<int>* vec) {
vec->clear();
for (int i = 0; i < VECSIZE; ++i) vec->push_back(i);
}
bool ReadWriteMessagePack() {
// Read/Write data via MpObject.
std::vector<int> vec;
std::vector<int> ans;
ans.reserve(VECSIZE);
vec.reserve(VECSIZE);
SetupVector(&vec);
ReallocOutputStream ostr;
ostr.Reserve(VECSIZE * 8);
uint64_t from, to1, to2;
from = GetTickTime();
{
MpObject obj;
obj.Box(vec);
MpWriter w;
w.Init(&ostr);
w.Write(obj); // Writes Boxed 'obj'.
w.Close();
ostr.Flush();
if (!w || !ostr) return false;
}
to1 = GetTickTime();
{
MpObject obj;
MpReader r;
MpReaderSettings rsettings;
rsettings.maxArraySize = VECSIZE;
ReallocOutputStream::UniquePtrType data;
size_t data_size = ostr.Release(&data);
MemoryInputStream istr(data.get(), data_size);
r.Init(&istr, rsettings);
r.Read(&obj); // Reads data onto 'obj' as a boxed object.
if (!r) return false;
obj.Unbox(&ans); // Unboxes 'obj' into vector<int>.
}
to2 = GetTickTime();
nlib_printf("time: ReadWriteMessagePack(VECSIZE = %d): write = %" PRIu64 ", read = %" PRIu64
" msec\n",
VECSIZE, to1 - from, to2 - to1);
// Verifies
if (ans != vec) return false;
return true;
}
bool ReadWriteMessagePackDirect() {
// Read/Write data without MpObject. It is faster if possible.
std::vector<int> vec;
std::vector<int> ans;
ans.reserve(VECSIZE);
vec.reserve(VECSIZE);
SetupVector(&vec);
ReallocOutputStream ostr;
ostr.Reserve(VECSIZE * 8);
uint64_t from, to1, to2;
from = GetTickTime();
{
MpWriter w;
w.Init(&ostr);
w.Write(vec); // Writes vector<int> directly.
w.Close();
ostr.Flush();
if (!w || !ostr) return false;
}
to1 = GetTickTime();
{
MpReader r;
MpReaderSettings rsettings;
rsettings.maxArraySize = VECSIZE;
ReallocOutputStream::UniquePtrType data;
size_t data_size = ostr.Release(&data);
MemoryInputStream istr(data.get(), data_size);
r.Init(&istr, rsettings);
r.Read(&ans); // Reads vector<int> directly.
if (!r) return false;
}
to2 = GetTickTime();
nlib_printf("time: ReadWriteMessagePackDirect(VECSIZE = %d): write = %" PRIu64
", read = %" PRIu64 " msec\n",
VECSIZE, to1 - from, to2 - to1);
// Verifies
if (ans != vec) return false;
return true;
}
bool SampleMain(int, char**) { return ReadWriteMessagePack() && ReadWriteMessagePackDirect(); }
NLIB_MAINFUNC