| Mûvelet | AcBinary | MessagePack | Arány | Eredmény |
|---|---|---|---|---|
| Serialize WithRef | 84.20 ?s | 18.84 ?s | 4.47× | MsgPack gyorsabb |
| Serialize NoRef | 70.18 ?s | 18.84 ?s | 3.73× | MsgPack gyorsabb |
| Deserialize WithRef | 40.10 ?s | 41.10 ?s | 0.98× | AcBinary gyorsabb |
| Deserialize NoRef | 1.02 ?s | 41.10 ?s | 0.025× | 40× gyorsabb! |
| Populate | 39.27 ?s | — | — | Csak AcBinary |
| PopulateMerge | 40.73 ?s | — | — | Csak AcBinary |
| Mûvelet | AcBinary | MessagePack | Gen0 | Gen1 | Értékelés |
|---|---|---|---|---|---|
| Serialize WithRef | 55.34 KB | 12.50 KB | 9.03 | — | 4.43× több |
| Serialize NoRef | 46.30 KB | 12.50 KB | 7.45 | — | 3.70× több |
| Deserialize WithRef | 38.17 KB | 26.24 KB | 6.23 | 0.43 | 1.45× több |
| Deserialize NoRef | 2.85 KB | 26.24 KB | 0.47 | 0.004 | 9× kevesebb! |
| Forrás | Becsült méret | Leírás |
|---|---|---|
ToArray() |
~19 KB | Végsõ byte[] allokáció a visszatérési értékhez |
Dictionary<object,int> |
~8 KB | Reference scanning: _scanOccurrences, _writtenRefs |
HashSet<object> |
~4 KB | Multi-referenced objektumok nyilvántartása |
Dictionary<string,int> |
~6 KB | Property name table + string interning |
List<string> |
~4 KB | Property nevek és interned stringek listái |
| Boxing | ~10 KB | Value type boxing a property getter-ekben |
| Egyéb | ~4 KB | Closure-ok, delegate-ek, átmeneti objektumok |
A ToArray() hívás ~19 KB allokációt okoz. Ehelyett IBufferWriter<byte>
interfész használatával a hívó biztosíthatja a buffert, elkerülve az allokációt.
Becsült megtakarítás: ~35% memória csökkenés serialize-nál
A jelenlegi Func<object, object?> getter minden value type-ot boxol.
Típusos getter-ek (Func<T, int>, stb.) használatával megszüntethetõ.
Becsült megtakarítás: ~10 KB / serialize (~18% csökkenés)
A Dictionary és HashSet objektumok a context pool-ban maradnak,
de Clear() után is megtartják a kapacitásukat. A poolban tárolás elõtt
érdemes lenne TrimExcess() hívni, vagy kisebb initial capacity-t használni.
Becsült megtakarítás: ~5 KB / serialize
A deszerializálásnál a Encoding.UTF8.GetString() új stringet allokál.
String.Create() span callback-kel közvetlenül a string bufferbe írhat.
Becsült megtakarítás: ~2 KB / deserialize komplex objektumoknál
NoRef módban is fut a CollectPropertyNames fázis a metaadathoz.
Ha a típus ismert és stabil, a property nevek elõre cache-elhetõk.
Becsült megtakarítás: ~10% sebesség javulás NoRef serialize-nál
A Convert.ToInt32(value) enum értékeknél boxing-ot okoz.
Típusos enum kezelés vagy Unsafe.As használatával elkerülhetõ.
Becsült megtakarítás: ~24 byte / enum érték
| Funkció | AcBinary | MessagePack | Megjegyzés |
|---|---|---|---|
| Reference Handling ($id/$ref) | ? | ? | Közös objektumok deduplikálása |
| Populate (meglévõ objektum) | ? | ? | Létezõ objektum frissítése |
| PopulateMerge (IId merge) | ? | ? | Lista elemek ID alapú merge |
| Schema Evolution | ? | ?? | Property név alapú mapping |
| Metadata Table | ? | ? | Property nevek indexelése |
| String Interning | ? | ? | Ismétlõdõ stringek deduplikálása |
| Kompakt méret | ?? | ? | MsgPack ~40% kisebb |
| Serialize sebesség | ?? | ? | MsgPack 3-4× gyorsabb |
| Deserialize sebesség | ? | ?? | AcBinary akár 40× gyorsabb |
AcBinary erõsségei:
Fejlesztendõ területek:
Javasolt következõ lépések prioritás szerint: