Rev 2501: Switching to direct access of members of the list drops us down to 305ms in http://bzr.arbash-meinel.com/branches/bzr/0.17-dev/dirstate_pyrex

John Arbash Meinel john at arbash-meinel.com
Fri May 4 20:46:28 BST 2007


At http://bzr.arbash-meinel.com/branches/bzr/0.17-dev/dirstate_pyrex

------------------------------------------------------------
revno: 2501
revision-id: john at arbash-meinel.com-20070504194612-ryl2chfi4dd53c2h
parent: john at arbash-meinel.com-20070504192637-1tzys0ugbgy21fw9
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: dirstate_pyrex
timestamp: Fri 2007-05-04 14:46:12 -0500
message:
  Switching to direct access of members of the list drops us down to 305ms
modified:
  bzrlib/compiled/dirstate_helpers.pyx dirstate_helpers.pyx-20070503201057-u425eni465q4idwn-3
-------------- next part --------------
=== modified file 'bzrlib/compiled/dirstate_helpers.pyx'
--- a/bzrlib/compiled/dirstate_helpers.pyx	2007-05-04 19:26:37 +0000
+++ b/bzrlib/compiled/dirstate_helpers.pyx	2007-05-04 19:46:12 +0000
@@ -27,6 +27,15 @@
 
 cdef extern from "Python.h":
     # GetItem returns a borrowed reference
+    struct _PyObject:
+        pass
+    ctypedef _PyObject PyObject
+
+    struct _PyListObject:
+        int ob_size
+        PyObject **ob_item
+    ctypedef _PyListObject PyListObject
+
     void *PyDict_GetItem(object p, object key)
     int PyDict_SetItem(object p, object key, object val) except -1
 
@@ -182,35 +191,33 @@
     return cur
 
 
-cdef object _fields_to_entry_0_parents(object fields, int offset):
+cdef object _fields_to_entry_0_parents(PyListObject *fields, int offset):
     cdef object path_name_file_id_key
     cdef char *size_str
     cdef unsigned long int size
     cdef char* executable_str
-    cdef object is_executable
-    if not PyList_CheckExact(fields):
-        raise TypeError('fields must be a list')
-    path_name_file_id_key = (_List_GetItem_Incref(fields, offset+0),
-                             _List_GetItem_Incref(fields, offset+1),
-                             _List_GetItem_Incref(fields, offset+2),
+    cdef int is_executable
+    cdef PyObject **base
+    base = fields.ob_item + offset
+    path_name_file_id_key = (<object>(base[0]),
+                             <object>(base[1]),
+                             <object>(base[2]),
                             )
 
-    size_str = PyString_AS_STRING_void(
-                PyList_GetItem_object_void(fields, offset+5))
+    size_str = PyString_AS_STRING_void(<void*>(base[5]))
     size = strtoul(size_str, NULL, 10)
-    executable_str = PyString_AS_STRING_void(
-                        PyList_GetItem_object_void(fields, offset+6))
+    executable_str = PyString_AS_STRING_void(<void*>(base[6]))
     if executable_str[0] == c'y':
-        is_executable = True
+        is_executable = 0
     else:
-        is_executable = False
+        is_executable = 0
     return (path_name_file_id_key, [
         ( # Current tree
-            _List_GetItem_Incref(fields, offset+3),# minikind
-            _List_GetItem_Incref(fields, offset+4),# fingerprint
-            size,                                  # size
-            is_executable,                         # executable
-            _List_GetItem_Incref(fields, offset+7),# packed_stat or revision_id
+            <object>(base[3]),# minikind
+            <object>(base[4]),# fingerprint
+            size,             # size
+            is_executable,    # executable
+            <object>(base[7]),# packed_stat or revision_id
         )])
 
 
@@ -225,13 +232,16 @@
     cdef char* current_dirname_str
     cdef int current_dirname_size
 
+    if not PyList_CheckExact(fields):
+        raise TypeError('fields must be a list')
+
     state._dirblocks = [('', []), ('', [])]
     current_block = state._dirblocks[0][1]
     current_dirname_str = ''
     current_dirname_size = 0
 
     while pos < field_count:
-        entry = _fields_to_entry_0_parents(fields, pos)
+        entry = _fields_to_entry_0_parents(<PyListObject *>fields, pos)
         pos = pos + entry_size
         dirname = PyTuple_GetItem_void_void(
                     PyTuple_GetItem_void_void(<void*>entry, 0), 0)



More information about the bazaar-commits mailing list