~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/_btree_serializer_pyx.pyx

Interning the most common 'value' entries saves about 1-2% of peak memory.

Namely, interning the '0' content values.
Note that most values have a common prefix now, and an uncommon suffix...

Show diffs side-by-side

added added

removed removed

Lines of Context:
79
79
        pos = pos - 1
80
80
    return NULL
81
81
 
 
82
 
82
83
# TODO: Import this from _dirstate_helpers when it is merged
83
84
cdef object safe_string_from_size(char *s, Py_ssize_t size):
84
85
    if size < 0:
196
197
        cdef char *ref_ptr
197
198
        cdef char *next_start
198
199
        cdef int loop_counter
 
200
        cdef Py_ssize_t str_len
199
201
 
200
202
        self._start = self._cur_str
201
203
        # Find the next newline
231
233
            # Invalid line
232
234
            raise AssertionError("Failed to find the value area")
233
235
        else:
234
 
            # capture the value string
235
 
            value = safe_string_from_size(temp_ptr + 1, last - temp_ptr - 1)
 
236
            # Because of how conversions were done, we ended up with *lots* of
 
237
            # values that are identical. These are all of the 0-length nodes
 
238
            # that are referred to by the TREE_ROOT (and likely some other
 
239
            # directory nodes.) For example, bzr has 25k references to
 
240
            # something like '12607215 328306 0 0', which ends up consuming 1MB
 
241
            # of memory, just for those strings.
 
242
            str_len = last - temp_ptr - 1
 
243
            if (str_len > 4
 
244
                and strncmp(" 0 0", last - 4, 4) == 0):
 
245
                # This drops peak mem for bzr.dev from 87.4MB => 86.2MB
 
246
                # For Launchpad 236MB => 232MB
 
247
                value = safe_interned_string_from_size(temp_ptr + 1, str_len)
 
248
            else:
 
249
                value = safe_string_from_size(temp_ptr + 1, str_len)
236
250
            # shrink the references end point
237
251
            last = temp_ptr
 
252
 
238
253
        if self.ref_list_length:
239
254
            ref_lists = StaticTuple_New(self.ref_list_length)
240
255
            loop_counter = 0