forked from OSchip/llvm-project
[demangler] Improve buffer hysteresis
Improve demangler buffer hysteresis. If we needed more than double the buffer, the original code would allocate exactly the amount needed, and thus consequently the next request would also realloc. We're very unlikely to get into wanting more than double, after the first allocation, as it would require the user to have used an identifier larger than the hysteresis. With machine generated code that's possible, but unlikely. Reviewed By: ChuanqiXu Differential Revision: https://reviews.llvm.org/D119972
This commit is contained in:
parent
e5c98e22fb
commit
024495e626
|
@ -37,10 +37,10 @@ class OutputBuffer {
|
|||
void grow(size_t N) {
|
||||
size_t Need = N + CurrentPosition;
|
||||
if (Need > BufferCapacity) {
|
||||
// Avoid many reallocations during startup, with a bit of hysteresis.
|
||||
constexpr size_t MinInitAlloc = 1024;
|
||||
if (Need < MinInitAlloc)
|
||||
Need = MinInitAlloc;
|
||||
// Reduce the number of reallocations, with a bit of hysteresis. The
|
||||
// number here is chosen so the first allocation will more-than-likely not
|
||||
// allocate more than 1K.
|
||||
Need += 1024 - 32;
|
||||
BufferCapacity *= 2;
|
||||
if (BufferCapacity < Need)
|
||||
BufferCapacity = Need;
|
||||
|
|
|
@ -37,10 +37,10 @@ class OutputBuffer {
|
|||
void grow(size_t N) {
|
||||
size_t Need = N + CurrentPosition;
|
||||
if (Need > BufferCapacity) {
|
||||
// Avoid many reallocations during startup, with a bit of hysteresis.
|
||||
constexpr size_t MinInitAlloc = 1024;
|
||||
if (Need < MinInitAlloc)
|
||||
Need = MinInitAlloc;
|
||||
// Reduce the number of reallocations, with a bit of hysteresis. The
|
||||
// number here is chosen so the first allocation will more-than-likely not
|
||||
// allocate more than 1K.
|
||||
Need += 1024 - 32;
|
||||
BufferCapacity *= 2;
|
||||
if (BufferCapacity < Need)
|
||||
BufferCapacity = Need;
|
||||
|
|
|
@ -78,3 +78,16 @@ TEST(OutputBufferTest, Prepend) {
|
|||
|
||||
std::free(OB.getBuffer());
|
||||
}
|
||||
|
||||
// Test when initial needed size is larger than the default.
|
||||
TEST(OutputBufferTest, Extend) {
|
||||
OutputBuffer OB;
|
||||
|
||||
char Massive[2000];
|
||||
std::memset(Massive, 'a', sizeof(Massive));
|
||||
Massive[sizeof(Massive) - 1] = 0;
|
||||
OB << Massive;
|
||||
EXPECT_EQ(Massive, toString(OB));
|
||||
|
||||
std::free(OB.getBuffer());
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue