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.
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:
{
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)
if (buffersize == 0)
{
buffer.reset(nullptr);
- buffersize_max = 0;
if (To == InitialTo)
return nullptr;
break;