Changeset 180908 in webkit
- Timestamp:
- Mar 2, 2015 4:38:29 PM (9 years ago)
- Location:
- trunk/Source/bmalloc
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/bmalloc/ChangeLog
r180806 r180908 1 2015-03-02 Geoffrey Garen <ggaren@apple.com> 2 3 bmalloc: Eagerly remove allocated objects from the free list 4 https://bugs.webkit.org/show_bug.cgi?id=142194 5 6 Reviewed by Andreas Kling. 7 8 This reduces the pressure to garbage collect the free list. 9 10 Might be a 1% speedup on MallocBench. 11 12 * bmalloc/FreeList.cpp: Put this comment at the top of the file instead 13 of repeating it inside of each function. Tried to clarify the details. 14 15 (bmalloc::FreeList::takeGreedy): Matched the other iteration code in this 16 file for consistency -- even though either direction works fine in this 17 function. 18 19 (bmalloc::FreeList::take): Change to iterate from low to high so that we 20 can maintain an index into the vector that is not disturbed even if we 21 pop from the middle (which invalidates the last index in the vector). 22 23 Decrement i when popping from the middle to make sure that we don't 24 skip the next item after popping. 25 26 (bmalloc::FreeList::removeInvalidAndDuplicateEntries): Ditto. 27 1 28 2015-02-27 Ryosuke Niwa <rniwa@webkit.org> 2 29 -
trunk/Source/bmalloc/bmalloc/FreeList.cpp
r180797 r180908 30 30 namespace bmalloc { 31 31 32 // We don't eagerly remove invalidated entries from the free list when we merge 33 // large objects. This means that the free list can contain invalid and/or 34 // duplicate entries. (Repeating a merge-and-then-split produces a duplicate.) 35 36 // To avoid infinite growth in invalid entries, we incrementally remove 37 // invalid entries as we discover them during allocation, and we also garbage 38 // collect the free list as it grows. 39 32 40 LargeObject FreeList::takeGreedy(Owner owner) 33 41 { 34 for (size_t i = m_vector.size(); i-- > 0; ) { 35 // We don't eagerly remove items when we merge and/or split ranges, 36 // so we need to validate each free list entry before using it. 42 for (size_t i = 0; i < m_vector.size(); ++i) { 37 43 LargeObject largeObject(LargeObject::DoNotValidate, m_vector[i].begin()); 38 44 if (!largeObject.isValidAndFree(owner, m_vector[i].size())) { 39 m_vector.pop(i );45 m_vector.pop(i--); 40 46 continue; 41 47 } 42 48 43 m_vector.pop(i );49 m_vector.pop(i--); 44 50 return largeObject; 45 51 } … … 50 56 LargeObject FreeList::take(Owner owner, size_t size) 51 57 { 52 LargeObject first; 53 size_t end = m_vector.size() > freeListSearchDepth ? m_vector.size() - freeListSearchDepth : 0; 54 for (size_t i = m_vector.size(); i-- > end; ) { 55 // We don't eagerly remove items when we merge and/or split ranges, so 56 // we need to validate each free list entry before using it. 58 LargeObject candidate; 59 size_t candidateIndex; 60 size_t begin = m_vector.size() > freeListSearchDepth ? m_vector.size() - freeListSearchDepth : 0; 61 for (size_t i = begin; i < m_vector.size(); ++i) { 57 62 LargeObject largeObject(LargeObject::DoNotValidate, m_vector[i].begin()); 58 63 if (!largeObject.isValidAndFree(owner, m_vector[i].size())) { 59 m_vector.pop(i );64 m_vector.pop(i--); 60 65 continue; 61 66 } … … 64 69 continue; 65 70 66 if (!! first && first.begin() < largeObject.begin())71 if (!!candidate && candidate.begin() < largeObject.begin()) 67 72 continue; 68 73 69 first = largeObject; 74 candidate = largeObject; 75 candidateIndex = i; 70 76 } 71 72 return first; 77 78 if (!!candidate) 79 m_vector.pop(candidateIndex); 80 return candidate; 73 81 } 74 82 … … 78 86 size_t alignmentMask = alignment - 1; 79 87 80 LargeObject first; 81 size_t end = m_vector.size() > freeListSearchDepth ? m_vector.size() - freeListSearchDepth : 0; 82 for (size_t i = m_vector.size(); i-- > end; ) { 83 // We don't eagerly remove items when we merge and/or split ranges, so 84 // we need to validate each free list entry before using it. 88 LargeObject candidate; 89 size_t candidateIndex; 90 size_t begin = m_vector.size() > freeListSearchDepth ? m_vector.size() - freeListSearchDepth : 0; 91 for (size_t i = begin; i < m_vector.size(); ++i) { 85 92 LargeObject largeObject(LargeObject::DoNotValidate, m_vector[i].begin()); 86 93 if (!largeObject.isValidAndFree(owner, m_vector[i].size())) { 87 m_vector.pop(i );94 m_vector.pop(i--); 88 95 continue; 89 96 } … … 95 102 continue; 96 103 97 if (!! first && first.begin() < largeObject.begin())104 if (!!candidate && candidate.begin() < largeObject.begin()) 98 105 continue; 99 106 100 first = largeObject; 107 candidate = largeObject; 108 candidateIndex = i; 101 109 } 102 110 103 return first; 111 if (!!candidate) 112 m_vector.pop(candidateIndex); 113 return candidate; 104 114 } 105 115 106 116 void FreeList::removeInvalidAndDuplicateEntries(Owner owner) 107 117 { 108 for (size_t i = m_vector.size(); i-- > 0;) {118 for (size_t i = 0; i < m_vector.size(); ++i) { 109 119 LargeObject largeObject(LargeObject::DoNotValidate, m_vector[i].begin()); 110 120 if (!largeObject.isValidAndFree(owner, m_vector[i].size())) { 111 m_vector.pop(i );121 m_vector.pop(i--); 112 122 continue; 113 123 } … … 116 126 } 117 127 118 for (size_t i = m_vector.size(); i-- > 0;) {128 for (size_t i = 0; i < m_vector.size(); ++i) { 119 129 LargeObject largeObject(LargeObject::DoNotValidate, m_vector[i].begin()); 120 130 if (largeObject.isMarked()) { 121 m_vector.pop(i );131 m_vector.pop(i--); 122 132 continue; 123 133 }
Note: See TracChangeset
for help on using the changeset viewer.