diff options
author | Adam Cozzette <acozzette@gmail.com> | 2016-09-21 10:39:23 -0700 |
---|---|---|
committer | Paul Yang <TeBoring@users.noreply.github.com> | 2016-09-21 10:39:23 -0700 |
commit | f81d44fafa3687f7d1c0059f1eab3fd4cb6b87f6 (patch) | |
tree | 211f7cb05b4bc0b90b7f84a75df263699a0865ff | |
parent | b9bc9904c22cf39d15ce00115bcbd77b61d2cc7a (diff) | |
download | protobuf-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-x | src/google/protobuf/compiler/js/js_generator.cc | 10 |
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 |