~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/lru_cache.py

  • Committer: John Arbash Meinel
  • Date: 2009-03-22 19:13:30 UTC
  • mto: This revision was merged to the branch mainline in revision 4197.
  • Revision ID: john@arbash-meinel.com-20090322191330-bbueodlalhf0onzh
Shave off approx 100ms by inlining _record_access into __getitem__,
also, play some tricks with member access, so that we don't pay double lookup costs
when we can avoid it.

Show diffs side-by-side

added added

removed removed

Lines of Context:
80
80
 
81
81
    def __getitem__(self, key):
82
82
        node = self._cache[key]
83
 
        # TODO: We may want to inline _record_access, to decrease the cost of
84
 
        #       __getitem__ calls
85
 
        self._record_access(node)
 
83
        # Inlined from _record_access to decrease the overhead of __getitem__
 
84
        # We also have more knowledge about structure if __getitem__ is
 
85
        # succeeding, then we know that self._most_recently_used must not be
 
86
        # None, etc.
 
87
        mru = self._most_recently_used
 
88
        if node is mru:
 
89
            # Nothing to do, this node is already at the head of the queue
 
90
            return node.value
 
91
        elif node is self._last_recently_used:
 
92
            assert node.prev is not None
 
93
            self._last_recently_used = node.prev
 
94
        # Remove this node from the old location
 
95
        node_prev = node.prev
 
96
        node_next = node.next
 
97
        if node_prev is not None:
 
98
            node_prev.next = node_next
 
99
        if node_next is not None:
 
100
            node_next.prev = node_prev
 
101
        # Insert this node to the front of the list
 
102
        node.next = mru
 
103
        mru.prev = node
 
104
        self._most_recently_used = node
 
105
        node.prev = None
86
106
        return node.value
87
107
 
88
108
    def __len__(self):
138
158
        node = self._cache.get(key, None)
139
159
        if node is None:
140
160
            return default
 
161
        # XXX: We need a test for this
 
162
        # self._record_access(node)
141
163
        return node.value
142
164
 
143
165
    def keys(self):