~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/_btree_serializer_pyx.pyx

Using Key_New() rather than Key(PyTuple_New()) gets us to 720ms.
It takes some gymnastics to get it to work, because we have to export the
symbol and then find the .lib file to use it from the pyrex code.
setup.py syntax doesn't seem to support that cleanly :(
Going further, we'll have to update _flatten_node to support Key nodes,
since right now it has some explicit 'is tuple' checks that fail.

Show diffs side-by-side

added added

removed removed

Lines of Context:
55
55
    # void *memrchr(void *s, int c, size_t n)
56
56
    int strncmp(char *s1, char *s2, size_t n)
57
57
 
 
58
cdef extern from "_keys_type_c.h":
 
59
    cdef struct Key:
 
60
        pass
 
61
    object Key_New(Py_ssize_t)
 
62
    # Steals a reference and Val must be a PyStringObject, no checking is done
 
63
    void Key_SET_ITEM(object key, Py_ssize_t offset, object val)
 
64
    object Key_GET_ITEM(object key, Py_ssize_t offset)
 
65
 
58
66
 
59
67
# TODO: Find some way to import this from _dirstate_helpers
60
68
cdef void* _my_memrchr(void *s, int c, size_t n):
145
153
        cdef char *temp_ptr
146
154
        cdef int loop_counter
147
155
        # keys are tuples
148
 
        key = PyTuple_New(self.key_length)
 
156
        key = Key_New(self.key_length)# PyTuple_New(self.key_length)
149
157
        for loop_counter from 0 <= loop_counter < self.key_length:
150
158
            # grab a key segment
151
159
            temp_ptr = <char*>memchr(self._start, c'\0', last - self._start)
168
176
            # advance our pointer
169
177
            self._start = temp_ptr + 1
170
178
            Py_INCREF(key_element)
171
 
            PyTuple_SET_ITEM(key, loop_counter, key_element)
172
 
        return _keys_type_c.Key(*key)
 
179
            # PyTuple_SET_ITEM(key, loop_counter, key_element)
 
180
            Key_SET_ITEM(key, loop_counter, key_element)
 
181
        # return _keys_type_c.Key(*key)
 
182
        return key
173
183
 
174
184
    cdef int process_line(self) except -1:
175
185
        """Process a line in the bytes."""