Skip to content
Snippets Groups Projects
Commit ee44592a authored by Rob Swindell's avatar Rob Swindell :speech_balloon:
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 a0d1e8d1
No related branches found
No related tags found
No related merge requests found
......@@ -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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment