Buenos días a todos,serialización C++ más rápida?
Estoy buscando una técnica de serialización binaria muy rápida para C++. Solo necesito serializar los datos contenidos en los objetos (sin punteros, etc.). Me gustaría que sea tan rápido como posible. Si es específico del hardware x86, es aceptable.
Estoy familiarizado con los métodos de C para hacer esto. Como prueba, he bench marcado un par de técnicas. Descubrí que el método C es un 40% más rápido que el mejor método C++ que implementé.
¿Alguna sugerencia sobre cómo mejorar el método C++ (o las bibliotecas que hacen esto)? ¿Hay algo bueno disponible para los archivos mapeados en memoria?
Gracias
// 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);
}
Alrededor de 1,6 segundos para pruebas = 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);
}
alrededor de 2,6 segundos para pruebas = 10000000
Esto no es una serialización, es un volcado de memoria. No funciona si el diseño de la memoria de sus objetos cambia, o si pasa de una plataforma big-endian a una little-endian. –
Ese código no es igual. En el operador << debe simplemente << v.off/v.size y no hacer lo que ha hecho. Tampoco empaquetaste la clase de prueba, ni truncaste el archivo en C, y en C++ hiciste dos llamadas de escritura, una para cada miembro, mientras que en C escribiste toda la estructura a la vez. – Puppy
Hasta donde entiendo, las transmisiones en C++ son bastante lentas. (intercambio es su capacidad de tipeo). –