Come funziona Google buffer protocollo confronta con ASN.1
-
09-09-2019 - |
Domanda
Quali sono le differenze più inferme tra Google buffer protocollo e ASN.1 (con PER-codifica)? Per il mio progetto la questione più imporante è la dimensione dei dati serializzati. Qualcuno ha fatto qualsiasi confronto dei dati di dimensioni tra i due?
Soluzione
E 'da molto tempo che ho fatto alcun lavoro ASN.1, ma la dimensione è molto probabile che dipendono i dettagli della vostra tipi e dati reali.
Mi con forza consiglia di prototipi entrambi e mettere un po 'di dati reale per confrontare.
Se il buffer di protocollo conterrebbe ripetuto tipi primitivi, si dovrebbe guardare al più tardi fonte in Subversion per buffer protocollo - possono essere rappresentati in un formato "imballato" ora che è molto più efficiente dello spazio. (Il mio C # porta ha solo preso con questa caratteristica, un po 'di tempo la scorsa settimana.)
Altri suggerimenti
Se si utilizza ASN.1 con Unaligned PER, e definire i tipi di dati utilizzando i vincoli del caso (ad esempio, specificando limiti inferiori / superiori per gli interi, limiti superiori per la lunghezza delle liste, ecc), le vostre codifiche saranno molto compatto. Non ci saranno bit sprecato per cose come allineamenti o tra i campi, e ogni campo verranno codificati nel numero minimo di bit necessari per tenere la sua gamma di valori consentiti. Ad esempio, un campo di tipo INTEGER (1..8) viene codificato in 3 bit (1 = '000', 2 = '001', ..., 8 = '111'); e una scelta con quattro alternative occuperà 2 bit (indicando l'alternativa prescelta) più i bit occupati alternativa selezionata. ASN.1 ha molte altre caratteristiche interessanti che sono stati utilizzati con successo in molti standard pubblicati. Un esempio è il marcatore estensione ( "..."), che, applicato sequenza, alla scelta, enumerati, e di altri tipi, permette compatibilità regressiva e in avanti tra le terminazioni di attuazione diverse versioni delle specifiche.
Quando le dimensioni del messaggio confezionato / codificato è importante si dovrebbe anche notare il fatto che protobuf non è in grado di confezionare i campi repeated
che non sono di un primitive numeric type
, leggere questo per ulteriori informazioni.
Questo è un problema per esempio se vi sono messaggi di quel tipo: (commento definisce attuale gamma di valori)
message P{
required sint32 x = 1; // -0x1ffff to 0x20000
required sint32 y = 2; // -0x1ffff to 0x20000
required sint32 z = 3; // -0x319c to 0x3200
}
message Array{
repeated P ps = 1;
optional uint32 somemoredata = 2;
}
In caso si ha una lunghezza di matrice, per esempio, 32 che si tradurrà in una dimensione di messaggi ricco di circa 250 a 450 byte con protobuf, secondo quali valori della matrice contiene effettivamente. Questo può anche aumentare fino a più di 1000 byte nel caso in cui si utilizza la gamma a 32 bit completa o nel caso in cui si utilizza int32
invece di sint32
e hanno valori negativi.
I dati blob greggio (supponendo che z può essere definito come valore int16
) consumerebbe solo 320 byte e quindi la ASN.1 messaggio è sempre minore di 320 byte poiché i valori massimi non sono in realtà 32bit ma 19bit (x, y) e 15bit (z).
La dimensione del messaggio protobuf può essere ottimizzato con questa definizione messaggio:
message Ps{
repeated sint32 xs = 1 [packed=true];
repeated sint32 ys = 2 [packed=true];
repeated sint32 zs = 3 [packed=true];
}
message Array{
required Ps ps = 1;
optional uint32 somemoredata = 2;
}
che determina le dimensioni dei messaggi tra circa 100 byte (tutti i valori sono zeri), 300 byte (valori a portata massima) e 500 byte (tutti i valori sono valori elevati 32bit).