nlib
msgpack/msgpack2/msgpack2.cpp

静的型を直接MessagePackで読み書きするサンプルです。 読み書きするデータ型が完全に決まっていて性能を重視する場合は、MpObjectを介さずにデータを読み書きすることで高速にデータの読み書きを行うことができます。

サンプルでは以下のようなことを行なっています。

以下がサンプルのソースコードになります。

#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