Commit 914790f5 authored by Rob Swindell's avatar Rob Swindell 💬
Browse files

Improve file copy (fcopy()) performance by more than an order of magnitude.

Using a 256KB read buffer for copying files (rather than one byte at a time).
Apparently calling fread() is not the same as a bunch of calls to fgetc()
after all. Or maybe it was the many calls to fputc() being replaced with
fwrite(). Or maybe it was both. Anyway, decreased the time to copy a 1GB
file from and to a Samba share over a Gb Ethernet network from 13 minutes
to less than a minute. This matters when sbbs is backing up your data/mail
base and the files are big. The mail base is locked while being backed up
and the longer it takes to back up, the longer the mail base is locked and
no mail can be received, read or sent during that time.
parent 2411b2d7
Pipeline #94 passed with stage
in 10 minutes and 47 seconds
......@@ -150,7 +150,7 @@ BOOL fmutex(const char* fname, const char* text, long max_age)
BOOL fcopy(const char* src, const char* dest)
{
int ch;
uint8_t buf[256 * 1024];
ulong count=0;
FILE* in;
FILE* out;
......@@ -164,14 +164,14 @@ BOOL fcopy(const char* src, const char* dest)
}
while(!feof(in)) {
if((ch=fgetc(in))==EOF)
size_t rd = fread(buf, sizeof(uint8_t), sizeof(buf), in);
if(rd < 1)
break;
if(fputc(ch,out)==EOF) {
success=FALSE;
if(fwrite(buf, sizeof(uint8_t), rd, out) != rd) {
success = FALSE;
break;
}
if(((count++)%(32*1024))==0)
MAYBE_YIELD();
MAYBE_YIELD();
}
fclose(in);
......
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