Browse Source

Optimized read_dict operation in Modelverse: read_dict of entry created
by create_dict is cached

Yentl Van Tendeloo 9 years ago
parent
commit
3d32219f73
2 changed files with 27 additions and 3 deletions
  1. 11 3
      hybrid_server/run_mvk_server.py
  2. 16 0
      state/modelverse_state/main.py

+ 11 - 3
hybrid_server/run_mvk_server.py

@@ -4,8 +4,12 @@ sys.path.append("../")
 import server
 import socket2event
 
-#import yappi
-#yappi.start()
+try:
+    #import yappi
+    #yappi.start()
+    pass
+except ImportError:
+    pass
 controller = server.Controller(sys.argv[1:])
 socket2event.boot_translation_service(controller)
 controller.start()
@@ -16,4 +20,8 @@ try:
         time.sleep(1)
 finally:
     controller.stop()
-    #yappi.get_func_stats().sort("tsub").print_all()
+    try:
+        #yappi.get_func_stats().sort("tsub").print_all()
+        pass
+    except:
+        pass

+ 16 - 0
state/modelverse_state/main.py

@@ -29,6 +29,8 @@ class ModelverseState(object):
         self.values = {}
         self.nodes = set()
 
+        self.cache = {}
+
         if bootfile is not None:
             self.root = self.parse(bootfile)
         else:
@@ -159,6 +161,7 @@ class ModelverseState(object):
         n = self.create_nodevalue(data)[0]
         e = self.create_edge(source, destination)[0]
         self.create_edge(e, n)
+        self.cache.setdefault(source, {})[data] = e
         return (None, status.SUCCESS)
 
     def read_value(self, node):
@@ -211,6 +214,18 @@ class ModelverseState(object):
         return (result, status.SUCCESS)
 
     def read_dict_edge(self, node, value):
+        try:
+            first = self.cache[node][value]
+            # Got hit, so validate
+            if (self.edges[first][0] == node) and \
+                (len(self.outgoing[first]) == 1) and \
+                (self.values[self.edges[list(self.outgoing[first])[0]][1]] == value):
+                return (first, status.SUCCESS)
+            del self.cache[node][value]
+        except KeyError:
+            # Didn't exist
+            pass
+
         if node not in self.nodes and node not in self.edges:
             return (None, status.FAIL_RDICTE_UNKNOWN)
         if not self.is_valid_datavalue(value):
@@ -236,6 +251,7 @@ class ModelverseState(object):
                             print("Duplicate key on value: %s (%s <-> %s)!" % (v, found, e1))
                             return (None, status.FAIL_RDICTE_AMBIGUOUS)
                         found = e1
+                        self.cache.setdefault(node, {})[value] = e1
         if found is not None:
             return (found, status.SUCCESS)
         else: