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() {
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;
{
MpObject obj;
obj.Box(vec);
MpWriter w;
w.Init(&ostr);
w.Write(obj);
w.Close();
ostr.Flush();
if (!w || !ostr) return false;
}
{
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);
if (!r) return false;
obj.Unbox(&ans);
}
nlib_printf(
"time: ReadWriteMessagePack(VECSIZE = %d): write = %" PRIu64
", read = %" PRIu64
" msec\n",
VECSIZE, to1 - from, to2 - to1);
if (ans != vec) return false;
return true;
}
bool ReadWriteMessagePackDirect() {
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;
{
MpWriter w;
w.Init(&ostr);
w.Write(vec);
w.Close();
ostr.Flush();
if (!w || !ostr) return false;
}
{
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);
if (!r) return false;
}
nlib_printf(
"time: ReadWriteMessagePackDirect(VECSIZE = %d): write = %" PRIu64
", read = %" PRIu64 " msec\n",
VECSIZE, to1 - from, to2 - to1);
if (ans != vec) return false;
return true;
}
bool SampleMain(int, char**) { return ReadWriteMessagePack() && ReadWriteMessagePackDirect(); }
NLIB_MAINFUNC