diff options
author | Wink Saville <wink@google.com> | 2010-06-07 17:04:13 -0700 |
---|---|---|
committer | Wink Saville <wink@google.com> | 2010-06-07 17:04:13 -0700 |
commit | 1b639e09d77de609bed080f5d2ca88d72ba42559 (patch) | |
tree | 97e6183ede78002b0299d76c99ea65e9c8d0f23c /src | |
parent | a3d3079a7ea18b2c052842272949247b7b4601e9 (diff) | |
download | external_protobuf-1b639e09d77de609bed080f5d2ca88d72ba42559.zip external_protobuf-1b639e09d77de609bed080f5d2ca88d72ba42559.tar.gz external_protobuf-1b639e09d77de609bed080f5d2ca88d72ba42559.tar.bz2 |
Changed speed optimization for strings.
Removed use of StringUtf8Micro and instead use an extra byte array
instance variable directly in the class. This allows the list returned
for repeated strings to be a String instead of a StringUtf8Micro
making the class compatible with existing code.
Removed PerfTimer.java which isn't used.
Change-Id: Ie6acfb40f98f59a48c1a795d86f715078f9611f5
Diffstat (limited to 'src')
-rw-r--r-- | src/google/protobuf/compiler/javamicro/javamicro_primitive_field.cc | 148 |
1 files changed, 82 insertions, 66 deletions
diff --git a/src/google/protobuf/compiler/javamicro/javamicro_primitive_field.cc b/src/google/protobuf/compiler/javamicro/javamicro_primitive_field.cc index d6daa44..70f5ac8 100644 --- a/src/google/protobuf/compiler/javamicro/javamicro_primitive_field.cc +++ b/src/google/protobuf/compiler/javamicro/javamicro_primitive_field.cc @@ -175,7 +175,7 @@ bool IsVariableLenType(JavaType type) { return false; } -bool IsStringUtf8Handling(const FieldDescriptor* descriptor, +bool IsFastStringHandling(const FieldDescriptor* descriptor, const Params params) { return ((params.optimization() == JAVAMICRO_OPT_SPEED) && (GetJavaType(descriptor) == JAVATYPE_STRING)); @@ -188,20 +188,8 @@ void SetPrimitiveVariables(const FieldDescriptor* descriptor, const Params param (*variables)["capitalized_name"] = UnderscoresToCapitalizedCamelCase(descriptor); (*variables)["number"] = SimpleItoa(descriptor->number()); - if (IsStringUtf8Handling(descriptor, params)) { - (*variables)["type"] = "com.google.protobuf.micro.StringUtf8Micro"; - string defaultValue = DefaultValue(params, descriptor); - if (defaultValue == "\"\"") { - (*variables)["default"] = - "com.google.protobuf.micro.StringUtf8Micro.EMPTY"; - } else { - (*variables)["default"] = "new com.google.protobuf.micro.StringUtf8Micro(" - + defaultValue + ")"; - } - } else { - (*variables)["type"] = PrimitiveTypeName(GetJavaType(descriptor)); - (*variables)["default"] = DefaultValue(params, descriptor); - } + (*variables)["type"] = PrimitiveTypeName(GetJavaType(descriptor)); + (*variables)["default"] = DefaultValue(params, descriptor); (*variables)["boxed_type"] = BoxedPrimitiveTypeName(GetJavaType(descriptor)); (*variables)["capitalized_type"] = GetCapitalizedType(descriptor); (*variables)["tag"] = SimpleItoa(WireFormat::MakeTag(descriptor)); @@ -238,28 +226,24 @@ GenerateMembers(io::Printer* printer) const { printer->Print(variables_, "private boolean has$capitalized_name$;\n" "private $type$ $name$_ = $default$;\n" + "public $type$ get$capitalized_name$() { return $name$_; }\n" "public boolean has$capitalized_name$() { return has$capitalized_name$; }\n"); - if (IsStringUtf8Handling(descriptor_, params_)) { + if (IsFastStringHandling(descriptor_, params_)) { printer->Print(variables_, - "public String get$capitalized_name$() { return $name$_.getString(); }\n" - "public $type$ get$capitalized_name$StringUtf8() { return $name$_; }\n" - "public $message_name$ set$capitalized_name$(String value) {\n" + "private byte [] $name$Utf8_ = null;\n" + "public $message_name$ set$capitalized_name$($type$ value) {\n" " has$capitalized_name$ = true;\n" - " if ($name$_ == $default$) {\n" - " $name$_ = new $type$(value);\n" - " } else {\n" - " $name$_.setString(value);\n" - " }\n" + " $name$_ = value;\n" + " $name$Utf8_ = null;\n" " return this;\n" "}\n" "public $message_name$ clear$capitalized_name$() {\n" " has$capitalized_name$ = false;\n" " $name$_ = $default$;\n" + " $name$Utf8_ = null;\n" " return this;\n" "}\n"); } else { - printer->Print(variables_, - "public $type$ get$capitalized_name$() { return $name$_; }\n"); if (IsVariableLenType(GetJavaType(descriptor_))) { printer->Print(variables_, "public $message_name$ set$capitalized_name$($type$ value) {\n" @@ -304,10 +288,10 @@ GenerateParsingCode(io::Printer* printer) const { void PrimitiveFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { - if (IsStringUtf8Handling(descriptor_, params_)) { + if (IsFastStringHandling(descriptor_, params_)) { printer->Print(variables_, "if (has$capitalized_name$()) {\n" - " output.writeStringUtf8($number$, get$capitalized_name$StringUtf8());\n" + " output.writeByteArray($number$, $name$Utf8_);\n" "}\n"); } else { printer->Print(variables_, @@ -319,11 +303,16 @@ GenerateSerializationCode(io::Printer* printer) const { void PrimitiveFieldGenerator:: GenerateSerializedSizeCode(io::Printer* printer) const { - if (IsStringUtf8Handling(descriptor_, params_)) { + if (IsFastStringHandling(descriptor_, params_)) { printer->Print(variables_, "if (has$capitalized_name$()) {\n" + " try {\n" + " $name$Utf8_ = $name$_.getBytes(\"UTF-8\");\n" + " } catch (java.io.UnsupportedEncodingException e) {\n" + " throw new RuntimeException(\"UTF-8 not supported.\");\n" + " }\n" " size += com.google.protobuf.micro.CodedOutputStreamMicro\n" - " .computeStringUtf8Size($number$, get$capitalized_name$StringUtf8());\n" + " .computeByteArraySize($number$, $name$Utf8_);\n" "}\n"); } else { printer->Print(variables_, @@ -353,32 +342,33 @@ RepeatedPrimitiveFieldGenerator::~RepeatedPrimitiveFieldGenerator() {} void RepeatedPrimitiveFieldGenerator:: GenerateMembers(io::Printer* printer) const { - if (IsStringUtf8Handling(descriptor_, params_)) { + if (IsFastStringHandling(descriptor_, params_)) { if (params_.java_use_vector()) { printer->Print(variables_, "private java.util.Vector $name$_ = new java.util.Vector();\n" "public java.util.Vector get$capitalized_name$List() {\n" " return $name$_;\n" "}\n" + "private java.util.Vector $name$Utf8_ = new java.util.Vector();\n" "public int get$capitalized_name$Count() { return $name$_.size(); }\n" - "public String get$capitalized_name$(int index) {\n" - " return (($type$)$name$_.elementAt(index)).getString();\n" - "}\n" - "public $type$ get$capitalized_name$StringUtf8(int index) {\n" - " return ($type$)$name$_.elementAt(index);\n" + "public $type$ get$capitalized_name$(int index) {\n" + " return (($type$)$name$_.elementAt(index));\n" "}\n" - "public $message_name$ set$capitalized_name$(int index, String value) {\n" + "public $message_name$ set$capitalized_name$(int index, $type$ value) {\n" "$null_check$" - " $name$_.setElementAt(new $type$(value), index);\n" + " $name$_.setElementAt(value, index);\n" + " $name$Utf8_ = null;\n" " return this;\n" "}\n" - "public $message_name$ add$capitalized_name$(String value) {\n" + "public $message_name$ add$capitalized_name$($type$ value) {\n" "$null_check$" - " $name$_.addElement(new $type$(value));\n" + " $name$_.addElement(value);\n" + " $name$Utf8_ = null;\n" " return this;\n" "}\n" "public $message_name$ clear$capitalized_name$() {\n" " $name$_.removeAllElements();\n" + " $name$Utf8_ = null;\n" " return this;\n" "}\n"); } else { @@ -388,25 +378,29 @@ GenerateMembers(io::Printer* printer) const { "public java.util.List<$type$> get$capitalized_name$List() {\n" " return $name$_;\n" // note: unmodifiable list "}\n" + "private java.util.List<byte []> $name$Utf8_ = null;\n" "public int get$capitalized_name$Count() { return $name$_.size(); }\n" - "public String get$capitalized_name$(int index) {\n" - " return $name$_.get(index).getString();\n" + "public $type$ get$capitalized_name$(int index) {\n" + " return $name$_.get(index);\n" "}\n" - "public $message_name$ set$capitalized_name$(int index, String value) {\n" + "public $message_name$ set$capitalized_name$(int index, $type$ value) {\n" "$null_check$" - " $name$_.set(index, new $type$(value));\n" + " $name$_.set(index, value);\n" + " $name$Utf8_ = null;\n" " return this;\n" "}\n" - "public $message_name$ add$capitalized_name$(String value) {\n" + "public $message_name$ add$capitalized_name$($type$ value) {\n" "$null_check$" " if ($name$_.isEmpty()) {\n" " $name$_ = new java.util.ArrayList<$type$>();\n" " }\n" - " $name$_.add(new $type$(value));\n" + " $name$_.add(value);\n" + " $name$Utf8_ = null;\n" " return this;\n" "}\n" "public $message_name$ clear$capitalized_name$() {\n" " $name$_ = java.util.Collections.emptyList();\n" + " $name$Utf8_ = null;\n" " return this;\n" "}\n"); } @@ -535,7 +529,7 @@ void RepeatedPrimitiveFieldGenerator:: GenerateSerializationCode(io::Printer* printer) const { if (descriptor_->options().packed()) { printer->Print(variables_, - "if (get$capitalized_name$List().size() > 0) {\n" + "if (get$capitalized_name$List().size() > 0) {\n" " output.writeRawVarint32($tag$);\n" " output.writeRawVarint32($name$MemoizedSerializedSize);\n" "}\n"); @@ -552,10 +546,10 @@ GenerateSerializationCode(io::Printer* printer) const { } } else { if (params_.java_use_vector()) { - if (IsStringUtf8Handling(descriptor_, params_)) { + if (IsFastStringHandling(descriptor_, params_)) { printer->Print(variables_, - "for (int i = 0; i < get$capitalized_name$List().size(); i++) {\n" - " output.writeStringUtf8($number$, get$capitalized_name$StringUtf8(i));\n" + "for (int i = 0; i < $name$Utf8_.size(); i++) {\n" + " output.writeByteArray($number$, (byte []) $name$Utf8_.get(i));\n" "}\n"); } else { printer->Print(variables_, @@ -564,10 +558,10 @@ GenerateSerializationCode(io::Printer* printer) const { "}\n"); } } else { - if (IsStringUtf8Handling(descriptor_, params_)) { + if (IsFastStringHandling(descriptor_, params_)) { printer->Print(variables_, - "for ($type$ element : get$capitalized_name$List()) {\n" - " output.writeStringUtf8($number$, element);\n" + "for (byte [] element : $name$Utf8_) {\n" + " output.writeByteArray($number$, element);\n" "}\n"); } else { printer->Print(variables_, @@ -588,29 +582,51 @@ GenerateSerializedSizeCode(io::Printer* printer) const { if (FixedSize(descriptor_->type()) == -1) { if (params_.java_use_vector()) { - printer->Print(variables_, - "for (int i = 0; i < get$capitalized_name$List().size(); i++) {\n" - " dataSize += com.google.protobuf.micro.CodedOutputStreamMicro\n"); - if (IsStringUtf8Handling(descriptor_, params_)) { + if (IsFastStringHandling(descriptor_, params_)) { printer->Print(variables_, - " .computeStringUtf8SizeNoTag(get$capitalized_name$StringUtf8(i));\n" + "$name$Utf8_ = new java.util.Vector();\n" + "byte[] bytes = null;\n" + "int sizeArray = get$capitalized_name$List().size();\n" + "for (int i = 0; i < sizeArray; i++) {\n" + " $type$ element = ($type$)$name$_.elementAt(i);\n" + " try {\n" + " bytes = element.getBytes(\"UTF-8\");\n" + " } catch (java.io.UnsupportedEncodingException e) {\n" + " throw new RuntimeException(\"UTF-8 not supported.\");\n" + " }\n" + " $name$Utf8_.addElement(bytes);\n" + " dataSize += com.google.protobuf.micro.CodedOutputStreamMicro\n" + " .computeByteArraySizeNoTag(bytes);\n" "}\n"); } else { printer->Print(variables_, + "for (int i = 0; i < get$capitalized_name$List().size(); i++) {\n" + " dataSize += com.google.protobuf.micro.CodedOutputStreamMicro\n" " .compute$capitalized_type$SizeNoTag(($type$)get$capitalized_name$(i));\n" "}\n"); } } else { - printer->Print(variables_, - "for ($type$ element : get$capitalized_name$List()) {\n" - " dataSize += com.google.protobuf.micro.CodedOutputStreamMicro\n"); - if (IsStringUtf8Handling(descriptor_, params_)) { - printer->Print(variables_, - " .computeStringUtf8SizeNoTag(element);\n" - "}\n"); + if (IsFastStringHandling(descriptor_, params_)) { + printer->Print(variables_, + "$name$Utf8_ = new java.util.ArrayList<byte[]>();\n" + "byte[] bytes = null;\n" + "int sizeArray = get$capitalized_name$List().size();\n" + "for (int i = 0; i < sizeArray; i++) {\n" + " $type$ element = get$capitalized_name$(i);\n" + " try {\n" + " bytes = element.getBytes(\"UTF-8\");\n" + " } catch (java.io.UnsupportedEncodingException e) {\n" + " throw new RuntimeException(\"UTF-8 not supported.\");\n" + " }\n" + " $name$Utf8_.add(bytes);\n" + " dataSize += com.google.protobuf.micro.CodedOutputStreamMicro\n" + " .computeByteArraySizeNoTag(bytes);\n" + "}\n"); } else { printer->Print(variables_, - " .compute$capitalized_type$SizeNoTag(element);\n" + "for ($type$ element : get$capitalized_name$List()) {\n" + " dataSize += com.google.protobuf.micro.CodedOutputStreamMicro\n" + " .compute$capitalized_type$SizeNoTag(element);\n" "}\n"); } } |