]> git.saurik.com Git - apt.git/commitdiff
Use a hardcoded buffer size of 4096 to fix performance
authorJulian Andres Klode <jak@debian.org>
Sat, 26 Dec 2015 13:49:00 +0000 (14:49 +0100)
committerJulian Andres Klode <jak@debian.org>
Sat, 26 Dec 2015 13:49:00 +0000 (14:49 +0100)
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.

apt-pkg/contrib/fileutl.cc

index 928a1065a31696b255085406e3bdd65781c975e1..162ad7e8df8ff42b22eb238c898c71fa68f0499d 100644 (file)
@@ -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;