forked from OSchip/llvm-project
improve MakeRopeString to avoid doing a malloc for every 2-character string
that gets inserted. This speeds up the rewriter another 10%. llvm-svn: 43896
This commit is contained in:
parent
9a00d3ec90
commit
3eb670721f
|
@ -130,8 +130,14 @@ public:
|
|||
class RewriteRope {
|
||||
std::vector<RopePiece*> Chunks;
|
||||
unsigned CurSize;
|
||||
|
||||
/// We allocate space for string data out of a buffer of size AllocChunkSize.
|
||||
/// This keeps track of how much space is left.
|
||||
RopeRefCountString *AllocBuffer;
|
||||
unsigned AllocOffs;
|
||||
enum { AllocChunkSize = 4080 };
|
||||
public:
|
||||
RewriteRope() : CurSize(0) {}
|
||||
RewriteRope() : CurSize(0), AllocBuffer(0), AllocOffs(AllocChunkSize) {}
|
||||
~RewriteRope() { clear(); }
|
||||
|
||||
typedef RewriteRopeIterator<char, RopePiece*> iterator;
|
||||
|
@ -257,6 +263,18 @@ public:
|
|||
|
||||
private:
|
||||
RopePiece MakeRopeString(const char *Start, const char *End) {
|
||||
unsigned Len = End-Start;
|
||||
|
||||
// If we have space for this string in the current alloc buffer, use it.
|
||||
if (AllocOffs+Len <= AllocChunkSize) {
|
||||
memcpy(AllocBuffer->Data+AllocOffs, Start, Len);
|
||||
AllocOffs += Len;
|
||||
return RopePiece(AllocBuffer, AllocOffs-Len, AllocOffs);
|
||||
}
|
||||
|
||||
// If we don't have enough room because this specific allocation is huge,
|
||||
// just allocate a new rope piece for it alone.
|
||||
if (Len > AllocChunkSize) {
|
||||
unsigned Size = End-Start+sizeof(RopeRefCountString)-1;
|
||||
RopeRefCountString *Res =
|
||||
reinterpret_cast<RopeRefCountString *>(new char[Size]);
|
||||
|
@ -265,6 +283,16 @@ private:
|
|||
return RopePiece(Res, 0, End-Start);
|
||||
}
|
||||
|
||||
// Otherwise, this was a small request but we just don't have space for it
|
||||
// Make a new chunk and share it with later allocations.
|
||||
unsigned AllocSize = sizeof(RopeRefCountString)-1+AllocChunkSize;
|
||||
AllocBuffer = reinterpret_cast<RopeRefCountString *>(new char[AllocSize]);
|
||||
AllocBuffer->RefCount = 0;
|
||||
memcpy(AllocBuffer->Data, Start, Len);
|
||||
AllocOffs = Len;
|
||||
return RopePiece(AllocBuffer, 0, Len);
|
||||
}
|
||||
|
||||
unsigned getChunkIdx(iterator Loc) const {
|
||||
// Return the loc idx of the specified chunk, handling empty ropes.
|
||||
return Loc.CurPiece == 0 ? 0 : Loc.CurPiece - &Chunks[0];
|
||||
|
|
Loading…
Reference in New Issue