protocolbuffers / protocolbuffers/protobuf-javascript

Javascript code is extraordinarily slow

Offen
#39 1 Kommentar 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

javascript P3 triaged
Vorherrschende Sprache
JavaScript
Sterne
471
Forks
91
Ø Merge
3 Std. 57 Min.
Gemergte PRs (30 T.)
2

Beschreibung

Version: 3.9.1
Language: Javascript

I have a message like this:

message Outer {
  repeated Inner inner = 1;
}
message Inner {
  repeated Item items = 1;
}
message Item {
  uint32 a = 1;
  uint32 b = 2;
  uint32 c = 3;
  uint32 d = 4;
  uint32 e = 5;
}

It contains approximately 1000 Inners and 700k Items in total and comes out at about 10MB. Using the default Javascript implementation of protobufs it takes 10 seconds to decode. I switched to using Mapbox pbf, and that only takes 170 milliseconds.

I looked at PBF's code and they don't seem to be doing anything special. decodeVarint looks like it has had some work to make Javascript engines happy with varints normally being less than 2^32, but... come on! That's 2 orders of magnitude! How is this implementation so slow?

Another issue is that this code generates objects with getters and setters, rather than just creating a plain object. Why? It just means I have to do even more tedious work when my message has been decoded to turn it into a form that I can easily use!

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne damit, den standardmäßigen JavaScript-Protobuf-Decoder anhand des gemeldeten verschachtelten Schemas und eines Datensatzes von ungefähr 10 MB zu profilieren, und vergleiche anschließend seine Varint-Dekodierung und Objekterstellung mit Mapbox PBF. Ermittle, ob die Performance-Lücke und das Getter-/Setter-Verhalten umsetzbare Änderungen darstellen; abgeschlossen bedeutet einen abgegrenzten Fix mit Messungen und Tests, die die Verbesserung zeigen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
javascript
Bereich
backend
Issue-Typ
Bug
Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Aktivitätsstatus
Veraltet
Klarheit
Muss geklärt werden
Anfängerfreundlichkeit
25/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.