summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2015-12-26 14:49:00 +0100
committerJulian Andres Klode <jak@debian.org>2015-12-26 14:49:00 +0100
commit0b29c72bdfc1466d47567cc3191b9661f81d3d3f (patch)
tree7654f9698d632a6b00ff62ab7046d7fa7bab9dfc
parent65ac6aad5f707849a127202f808d087d1fcaddc9 (diff)
downloadapt-0b29c72bdfc1466d47567cc3191b9661f81d3d3f.tar.gz
Use a hardcoded buffer size of 4096 to fix performance
The code uses memmove() to move parts of the buffer to the front when the buffer is only partially read. By simply reading one page at a time, the maximum size of bytes that must be moved has a hard limit, and performance improves: In one test case, consisting of a 430 MB Contents file, and a 75K PDiff, applying the PDiff previously took about 48 seconds and now completes in 2 seconds. Further speed up can be achieved by buffering writes, they account for about 60% of the run-time now.
-rw-r--r--apt-pkg/contrib/fileutl.cc6
1 files changed, 2 insertions, 4 deletions
diff --git a/apt-pkg/contrib/fileutl.cc b/apt-pkg/contrib/fileutl.cc
index 928a1065a..162ad7e8d 100644
--- a/apt-pkg/contrib/fileutl.cc
+++ b/apt-pkg/contrib/fileutl.cc
@@ -922,7 +922,7 @@ bool ChangeOwnerAndPermissionOfFile(char const * const requester, char const * c
class APT_HIDDEN FileFdPrivate { /*{{{*/
protected:
FileFd * const filefd;
- size_t buffersize_max = 0;
+ const size_t buffersize_max = 4096;
std::unique_ptr<char[]> buffer;
unsigned long long buffersize = 0;
public:
@@ -984,8 +984,7 @@ public:
{
if (buffer.get() == nullptr)
{
- buffer.reset(new char[Size]);
- buffersize_max = Size;
+ buffer.reset(new char[buffersize_max]);
}
unsigned long long actualread = 0;
if (filefd->Read(buffer.get(), buffersize_max, &actualread) == false)
@@ -994,7 +993,6 @@ public:
if (buffersize == 0)
{
buffer.reset(nullptr);
- buffersize_max = 0;
if (To == InitialTo)
return nullptr;
break;