Rev 4625: No need to pop one item off the stack after another. in http://bazaar.launchpad.net/~jameinel/bzr/1.19-known-graph-sorted

John Arbash Meinel john at arbash-meinel.com
Sun Aug 16 17:30:19 BST 2009


At http://bazaar.launchpad.net/~jameinel/bzr/1.19-known-graph-sorted

------------------------------------------------------------
revno: 4625
revision-id: john at arbash-meinel.com-20090816163005-owo9jl07h6xlnip1
parent: john at arbash-meinel.com-20090816161425-x842fray6gf3peid
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 1.19-known-graph-sorted
timestamp: Sun 2009-08-16 11:30:05 -0500
message:
  No need to pop one item off the stack after another.
  We can just iterate over the group and append to the output.
  Use direct function calls, rather than ordered.append.
  
  Down to:
   #  103ms graph.KnownGraph().merge_sort()
   #   55ms kg.merge_sort()
-------------- next part --------------
=== modified file 'bzrlib/_known_graph_pyx.pyx'
--- a/bzrlib/_known_graph_pyx.pyx	2009-08-16 16:14:25 +0000
+++ b/bzrlib/_known_graph_pyx.pyx	2009-08-16 16:30:05 +0000
@@ -474,8 +474,8 @@
 
     # Current performance numbers for merge_sort(bzr_dev_parent_map):
     #  310ms tsort.merge_sort()
-    #  112ms graph.KnownGraph().merge_sort()
-    #   64ms kg.merge_sort()
+    #  103ms graph.KnownGraph().merge_sort()
+    #   55ms kg.merge_sort()
 
     cdef KnownGraph graph
     cdef object _depth_first_stack  # list
@@ -567,14 +567,17 @@
                 else:
                     base_revno = ms_node.left_ms_parent.revno_first
                 temp = PyDict_GetItem(self._revno_to_branch_count,
-                                           base_revno)
+                                      base_revno)
                 if temp == NULL:
                     branch_count = 1
                 else:
                     branch_count = (<object>temp) + 1
                 PyDict_SetItem(self._revno_to_branch_count, base_revno,
                                branch_count)
-                ms_node.revno_first = base_revno
+                if ms_node.left_ms_parent.revno_first == -1:
+                    ms_node.revno_first = ms_node.left_ms_parent.revno_last
+                else:
+                    ms_node.revno_first = ms_node.left_ms_parent.revno_first
                 ms_node.revno_second = branch_count
                 ms_node.revno_last = 1
         else:
@@ -653,6 +656,7 @@
     cdef topo_order(self):
         cdef _MergeSortNode ms_node, ms_last_node
         cdef _KnownGraphNode next_node
+        cdef Py_ssize_t pos
 
         # print
         self._schedule_stack()
@@ -662,14 +666,17 @@
         # output.
         sequence_number = 0
         ordered = []
-        while self._scheduled_nodes:
-            ms_node = self._scheduled_nodes.pop()
-            # TODO: stop_revision not supported
-            # if ms_node == stop_revision:
-            if len(self._scheduled_nodes) == 0:
+        pos = PyList_GET_SIZE(self._scheduled_nodes) - 1
+        if pos >= 0:
+            ms_last_node = _get_ms_node(self._scheduled_nodes, pos)
+        while pos >= 0:
+            ms_node = ms_last_node
+            pos = pos - 1
+            if pos == -1:
+                # Final node is always the end-of-chain
                 end_of_merge = True
             else:
-                ms_last_node = self._scheduled_nodes[-1]
+                ms_last_node = _get_ms_node(self._scheduled_nodes, pos)
                 if ms_last_node.merge_depth < ms_node.merge_depth:
                     # Next node is to our left, so this is the end of the right
                     # chain
@@ -687,7 +694,9 @@
             else:
                 revno = (ms_node.revno_first, ms_node.revno_second,
                          ms_node.revno_last)
-            ordered.append((sequence_number, ms_node.node.key,
-                            ms_node.merge_depth, revno, end_of_merge))
+            PyList_Append(ordered, (sequence_number, ms_node.node.key,
+                                    ms_node.merge_depth, revno, end_of_merge))
             sequence_number = sequence_number + 1
+        # Clear out the scheduled nodes
+        self._scheduled_nodes = []
         return ordered



More information about the bazaar-commits mailing list