Доброе утро всем,
Я ищу очень быструю методику двоичной сериализации для c ++. Мне нужно только сериализовать данные, содержащиеся в объектах (без указателей и т. Д.). Я хотел бы, чтобы это было так быстро, как
возможный. Если это специфично для оборудования x86, это приемлемо.
Я знаком с методами C, делающими это. В качестве теста у меня на скамейке было отмечено несколько приемов. Я обнаружил, что метод C на 40% быстрее, чем лучший метод C ++, который я реализовал.
Есть предложения по улучшению метода C ++ (или библиотек, которые делают это)?
Что-нибудь хорошее для файлов с отображенной памятью?
Спасибо
// c style writes
{
#pragma pack(1)
struct item
{
uint64_t off;
uint32_t size;
} data;
#pragma pack
clock_t start = clock();
FILE* fd = fopen( "test.c.dat", "wb" );
for ( long i = 0; i < tests; i++ )
{
data.off = i;
data.size = i & 0xFFFF;
fwrite( (char*) &data, sizeof(data), 1, fd );
}
fclose( fd );
clock_t stop = clock();
double d = ((double)(stop-start))/ CLOCKS_PER_SEC;
printf( "%8.3f seconds\n", d );
}
около 1,6 секунд для тестов = 10000000
// c++ style ofstream writes
// define a DTO class
class test
{
public:
test(){}
uint64_t off;
uint32_t size;
friend std::ostream& operator<<( std::ostream& stream, const test& v );
};
// write to the stream
std::ostream& operator<<( std::ostream &stream, const test& v )
{
stream.write( (char*)&v.off, sizeof(v.off) );
stream.write( (char*)&v.size, sizeof(v.size) );
return stream;
}
{
test data;
clock_t start = clock();
std::ofstream out;
out.open( "test.cpp.dat", std::ios::out | std::ios::trunc | std::ios::binary );
for ( long i = 0; i < tests; i++ )
{
data.off = i;
data.size = i & 0xFFFF;
out << data;
}
out.close();
clock_t stop = clock();
double d = ((double)(stop-start))/ CLOCKS_PER_SEC;
printf( "%8.3f seconds\n", d );
}
около 2,6 секунд для тестов = 10000000