THRIFT-288. java: Generated code iterates maps during write inefficiently
authorBryan Duxbury <bryanduxbury@apache.org>
Thu, 29 Jan 2009 05:47:21 +0000 (05:47 +0000)
committerBryan Duxbury <bryanduxbury@apache.org>
Thu, 29 Jan 2009 05:47:21 +0000 (05:47 +0000)
Newly generated code will now use entrySet instead of keySet when serializing maps. Existing generated classes does not need to be regenerated, though they won't reap the performance improvements unless they do.

git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@738765 13f79535-47bb-0310-9956-ffa450edef68

compiler/cpp/src/generate/t_java_generator.cc

index e99583a..81fb590 100644 (file)
@@ -2467,10 +2467,11 @@ void t_java_generator::generate_serialize_container(ofstream& out,
   string iter = tmp("_iter");
   if (ttype->is_map()) {
     indent(out) <<
-      "for (" <<
-      type_name(((t_map*)ttype)->get_key_type()) << " " << iter <<
+      "for (Map.Entry<" <<
+      type_name(((t_map*)ttype)->get_key_type(), true, false) << ", " <<
+      type_name(((t_map*)ttype)->get_val_type(), true, false) << "> " << iter <<
       " : " <<
-      prefix << ".keySet())";
+      prefix << ".entrySet())";
   } else if (ttype->is_set()) {
     indent(out) <<
       "for (" <<
@@ -2518,9 +2519,9 @@ void t_java_generator::generate_serialize_map_element(ofstream& out,
                                                       t_map* tmap,
                                                       string iter,
                                                       string map) {
-  t_field kfield(tmap->get_key_type(), iter);
+  t_field kfield(tmap->get_key_type(), iter + ".getKey()");
   generate_serialize_field(out, &kfield, "");
-  t_field vfield(tmap->get_val_type(), map + ".get(" + iter + ")");
+  t_field vfield(tmap->get_val_type(), iter + ".getValue()");
   generate_serialize_field(out, &vfield, "");
 }