aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Cozzette <acozzette@gmail.com>2016-09-21 10:39:23 -0700
committerPaul Yang <TeBoring@users.noreply.github.com>2016-09-21 10:39:23 -0700
commitf81d44fafa3687f7d1c0059f1eab3fd4cb6b87f6 (patch)
tree211f7cb05b4bc0b90b7f84a75df263699a0865ff
parentb9bc9904c22cf39d15ce00115bcbd77b61d2cc7a (diff)
downloadprotobuf-f81d44fafa3687f7d1c0059f1eab3fd4cb6b87f6.tar.gz
protobuf-f81d44fafa3687f7d1c0059f1eab3fd4cb6b87f6.tar.bz2
protobuf-f81d44fafa3687f7d1c0059f1eab3fd4cb6b87f6.zip
Fixed quadratic behavior in JSPB deserialization of repeated fields (#2117) (#2146)
Currently deserialization of a non-packed binary repeated field is quadratic in the number of elements, because each time we parse a new element we copy over all elements we have parsed so far. This CL fixes the performance problem by having the generated deserialization code just call addX() instead of using getX() and setX().
-rwxr-xr-xsrc/google/protobuf/compiler/js/js_generator.cc10
1 files changed, 3 insertions, 7 deletions
diff --git a/src/google/protobuf/compiler/js/js_generator.cc b/src/google/protobuf/compiler/js/js_generator.cc
index 1a882057..fec465fe 100755
--- a/src/google/protobuf/compiler/js/js_generator.cc
+++ b/src/google/protobuf/compiler/js/js_generator.cc
@@ -2850,13 +2850,9 @@ void Generator::GenerateClassDeserializeBinaryField(
}
if (field->is_repeated() && !field->is_packed()) {
- // Repeated fields receive a |value| one at at a time; append to array
- // returned by get$name$(). Annoyingly, we have to call 'set' after
- // changing the array.
- printer->Print(" msg.get$name$().push(value);\n", "name",
- JSGetterName(options, field));
- printer->Print(" msg.set$name$(msg.get$name$());\n", "name",
- JSGetterName(options, field));
+ printer->Print(
+ " msg.add$name$(value);\n", "name",
+ JSGetterName(options, field, BYTES_DEFAULT, /* drop_list = */ true));
} else {
// Singular fields, and packed repeated fields, receive a |value| either
// as the field's value or as the array of all the field's values; set