Updated Branches:
  refs/heads/trunk f1af43d72 -> d97b39665

GIRAPH-715: Fix MessageValueFactory performance regression (nitay)


Project: http://git-wip-us.apache.org/repos/asf/giraph/repo
Commit: http://git-wip-us.apache.org/repos/asf/giraph/commit/d97b3966
Tree: http://git-wip-us.apache.org/repos/asf/giraph/tree/d97b3966
Diff: http://git-wip-us.apache.org/repos/asf/giraph/diff/d97b3966

Branch: refs/heads/trunk
Commit: d97b396654d476fb7e9c7d15d71d3553f1c48083
Parents: f1af43d
Author: Nitay Joffe <[email protected]>
Authored: Thu Jul 11 14:58:43 2013 -0400
Committer: Nitay Joffe <[email protected]>
Committed: Thu Jul 11 21:16:57 2013 -0400

----------------------------------------------------------------------
 CHANGELOG                                       |  2 ++
 .../ImmutableClassesGiraphConfiguration.java    | 18 +++++-----
 .../apache/giraph/factories/ValueFactories.java | 38 ++++++++++----------
 3 files changed, 31 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/giraph/blob/d97b3966/CHANGELOG
----------------------------------------------------------------------
diff --git a/CHANGELOG b/CHANGELOG
index b1f44c2..8cc0945 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,8 @@
 Giraph Change Log
 
 Release 1.1.0 - unreleased
+  GIRAPH-715: Fix MessageValueFactory performance regression (nitay)
+
   GIRAPH-709: More flexible Jython script loading (nitay)
 
   GIRAPH-708: Factories for creation of all IVEM types (nitay)

http://git-wip-us.apache.org/repos/asf/giraph/blob/d97b3966/giraph-core/src/main/java/org/apache/giraph/conf/ImmutableClassesGiraphConfiguration.java
----------------------------------------------------------------------
diff --git 
a/giraph-core/src/main/java/org/apache/giraph/conf/ImmutableClassesGiraphConfiguration.java
 
b/giraph-core/src/main/java/org/apache/giraph/conf/ImmutableClassesGiraphConfiguration.java
index ed63192..db24423 100644
--- 
a/giraph-core/src/main/java/org/apache/giraph/conf/ImmutableClassesGiraphConfiguration.java
+++ 
b/giraph-core/src/main/java/org/apache/giraph/conf/ImmutableClassesGiraphConfiguration.java
@@ -26,12 +26,12 @@ import org.apache.giraph.edge.OutEdges;
 import org.apache.giraph.edge.ReusableEdge;
 import org.apache.giraph.factories.ComputationFactory;
 import org.apache.giraph.factories.MessageValueFactory;
-import org.apache.giraph.graph.DefaultVertex;
-import org.apache.giraph.graph.Computation;
 import org.apache.giraph.factories.ValueFactories;
+import org.apache.giraph.factories.VertexValueFactory;
+import org.apache.giraph.graph.Computation;
+import org.apache.giraph.graph.DefaultVertex;
 import org.apache.giraph.graph.Vertex;
 import org.apache.giraph.graph.VertexResolver;
-import org.apache.giraph.factories.VertexValueFactory;
 import org.apache.giraph.io.EdgeInputFormat;
 import org.apache.giraph.io.VertexInputFormat;
 import org.apache.giraph.io.VertexOutputFormat;
@@ -103,7 +103,7 @@ public class ImmutableClassesGiraphConfiguration<I extends 
WritableComparable,
     classes = new GiraphClasses<I, V, E>(conf);
     useUnsafeSerialization = USE_UNSAFE_SERIALIZATION.get(this);
     valueFactories = new ValueFactories<I, V, E>(conf);
-    valueFactories.initializeAll(this);
+    valueFactories.initializeIVE(this);
   }
 
   /**
@@ -653,8 +653,9 @@ public class ImmutableClassesGiraphConfiguration<I extends 
WritableComparable,
    */
   public <M extends Writable> MessageValueFactory<M>
   getIncomingMessageValueFactory() {
-    MessageValueFactory<M> factory =
-        INCOMING_MESSAGE_VALUE_FACTORY_CLASS.newInstance(this);
+    Class<? extends MessageValueFactory> klass =
+        valueFactories.getInMsgFactoryClass();
+    MessageValueFactory<M> factory = ReflectionUtils.newInstance(klass, this);
     factory.initialize(this);
     return factory;
   }
@@ -677,8 +678,9 @@ public class ImmutableClassesGiraphConfiguration<I extends 
WritableComparable,
    */
   public <M extends Writable> MessageValueFactory<M>
   getOutgoingMessageValueFactory() {
-    MessageValueFactory<M> factory =
-        OUTGOING_MESSAGE_VALUE_FACTORY_CLASS.newInstance(this);
+    Class<? extends MessageValueFactory> klass =
+        valueFactories.getOutMsgFactoryClass();
+    MessageValueFactory<M> factory = ReflectionUtils.newInstance(klass, this);
     factory.initialize(this);
     return factory;
   }

http://git-wip-us.apache.org/repos/asf/giraph/blob/d97b3966/giraph-core/src/main/java/org/apache/giraph/factories/ValueFactories.java
----------------------------------------------------------------------
diff --git 
a/giraph-core/src/main/java/org/apache/giraph/factories/ValueFactories.java 
b/giraph-core/src/main/java/org/apache/giraph/factories/ValueFactories.java
index 98e59b3..733d5f2 100644
--- a/giraph-core/src/main/java/org/apache/giraph/factories/ValueFactories.java
+++ b/giraph-core/src/main/java/org/apache/giraph/factories/ValueFactories.java
@@ -23,6 +23,8 @@ import org.apache.hadoop.io.Writable;
 import org.apache.hadoop.io.WritableComparable;
 
 import static org.apache.giraph.conf.GiraphConstants.EDGE_VALUE_FACTORY_CLASS;
+import static 
org.apache.giraph.conf.GiraphConstants.INCOMING_MESSAGE_VALUE_FACTORY_CLASS;
+import static 
org.apache.giraph.conf.GiraphConstants.OUTGOING_MESSAGE_VALUE_FACTORY_CLASS;
 import static org.apache.giraph.conf.GiraphConstants.VERTEX_ID_FACTORY_CLASS;
 import static 
org.apache.giraph.conf.GiraphConstants.VERTEX_VALUE_FACTORY_CLASS;
 
@@ -45,22 +47,12 @@ public class ValueFactories<I extends WritableComparable,
   private final VertexValueFactory<V> vertexValueFactory;
   /** Edge value factory. */
   private final EdgeValueFactory<E> edgeValueFactory;
-
-  /**
-   * Constructor with types
-   *
-   * @param vertexIdFactory vertex id factory
-   * @param vertexValueFactory vertex value factory
-   * @param edgeValueFactory edge value factory
-   */
-  public ValueFactories(
-      VertexIdFactory<I> vertexIdFactory,
-      VertexValueFactory<V> vertexValueFactory,
-      EdgeValueFactory<E> edgeValueFactory) {
-    this.edgeValueFactory = edgeValueFactory;
-    this.vertexIdFactory = vertexIdFactory;
-    this.vertexValueFactory = vertexValueFactory;
-  }
+  // Note that for messages we store the class not the factory itself, because
+  // the factory instance may change per-superstep if the graph types change.
+  /** Incoming message value factory class */
+  private final Class<? extends MessageValueFactory> inMsgFactoryClass;
+  /** Outgoing message value factory class */
+  private final Class<? extends MessageValueFactory> outMsgFactoryClass;
 
   /**
    * Constructor reading from Configuration
@@ -71,6 +63,8 @@ public class ValueFactories<I extends WritableComparable,
     vertexIdFactory = VERTEX_ID_FACTORY_CLASS.newInstance(conf);
     vertexValueFactory = VERTEX_VALUE_FACTORY_CLASS.newInstance(conf);
     edgeValueFactory = EDGE_VALUE_FACTORY_CLASS.newInstance(conf);
+    inMsgFactoryClass = INCOMING_MESSAGE_VALUE_FACTORY_CLASS.get(conf);
+    outMsgFactoryClass = OUTGOING_MESSAGE_VALUE_FACTORY_CLASS.get(conf);
   }
 
   /**
@@ -78,8 +72,7 @@ public class ValueFactories<I extends WritableComparable,
    *
    * @param conf ImmutableClassesGiraphConfiguration
    */
-  public void initializeAll(
-      ImmutableClassesGiraphConfiguration<I, V, E> conf) {
+  public void initializeIVE(ImmutableClassesGiraphConfiguration<I, V, E> conf) 
{
     vertexIdFactory.initialize(conf);
     vertexValueFactory.initialize(conf);
     edgeValueFactory.initialize(conf);
@@ -89,7 +82,6 @@ public class ValueFactories<I extends WritableComparable,
     return edgeValueFactory;
   }
 
-
   public VertexIdFactory<I> getVertexIdFactory() {
     return vertexIdFactory;
   }
@@ -97,4 +89,12 @@ public class ValueFactories<I extends WritableComparable,
   public VertexValueFactory<V> getVertexValueFactory() {
     return vertexValueFactory;
   }
+
+  public Class<? extends MessageValueFactory> getInMsgFactoryClass() {
+    return inMsgFactoryClass;
+  }
+
+  public Class<? extends MessageValueFactory> getOutMsgFactoryClass() {
+    return outMsgFactoryClass;
+  }
 }

Reply via email to