Commit f9810f1b authored by Rob Pike's avatar Rob Pike

make io.ReadFile use Stat.Size as a hint for preallocation

R=rsc
CC=golang-dev
https://golang.org/cl/163069
parent 49ebcfbb
......@@ -26,7 +26,23 @@ func ReadFile(filename string) ([]byte, os.Error) {
return nil, err
}
defer f.Close();
return ReadAll(f);
// It's a good but not certain bet that Stat will tell us exactly how much to
// read, so let's try it but be prepared for the answer to be wrong.
dir, err := f.Stat();
var n uint64;
if err != nil && dir.Size < 2e9 { // Don't preallocate a huge buffer, just in case.
n = dir.Size
}
if n == 0 {
n = 1024 // No idea what's right, but zero isn't.
}
// Pre-allocate the correct size of buffer, then set its size to zero. The
// Buffer will read into the allocated space cheaply. If the size was wrong,
// we'll either waste some space off the end or reallocate as needed, but
// in the overwhelmingly common case we'll get it just right.
buf := bytes.NewBuffer(make([]byte, n)[0:0]);
_, err = Copy(buf, f);
return buf.Bytes(), err;
}
// WriteFile writes data to a file named by filename.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment