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?

È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top