StringSink pre allocate

When used with `readFile`, we have a pretty good heuristic of the file
size, so `reserve` this in the `string`. This will save some allocation
/ copy when the string is growing.
This commit is contained in:
Guillaume Bouchard 2020-04-29 18:44:01 +02:00
parent 7afcb5af98
commit 2e5be2a749
2 changed files with 8 additions and 4 deletions

View file

@ -312,7 +312,11 @@ unsigned char getFileType(const Path & path)
string readFile(int fd)
{
return drainFD(fd, true);
struct stat st;
if (fstat(fd, &st) == -1)
throw SysError("statting file");
return drainFD(fd, true, st.st_size);
}
@ -658,9 +662,9 @@ void writeFull(int fd, const string & s, bool allowInterrupts)
}
string drainFD(int fd, bool block)
string drainFD(int fd, bool block, const size_t reserveSize)
{
StringSink sink;
StringSink sink(reserveSize);
drainFD(fd, sink, block);
return std::move(*sink.s);
}

View file

@ -162,7 +162,7 @@ MakeError(EndOfFile, Error);
/* Read a file descriptor until EOF occurs. */
string drainFD(int fd, bool block = true);
string drainFD(int fd, bool block = true, const size_t reserveSize=0);
void drainFD(int fd, Sink & sink, bool block = true);