Skip to content
Snippets Groups Projects
Commit 914790f5 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 2411b2d7
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
Pipeline #94 passed
...@@ -150,7 +150,7 @@ BOOL fmutex(const char* fname, const char* text, long max_age) ...@@ -150,7 +150,7 @@ BOOL fmutex(const char* fname, const char* text, long max_age)
BOOL fcopy(const char* src, const char* dest) BOOL fcopy(const char* src, const char* dest)
{ {
int ch; uint8_t buf[256 * 1024];
ulong count=0; ulong count=0;
FILE* in; FILE* in;
FILE* out; FILE* out;
...@@ -164,13 +164,13 @@ BOOL fcopy(const char* src, const char* dest) ...@@ -164,13 +164,13 @@ BOOL fcopy(const char* src, const char* dest)
} }
while(!feof(in)) { while(!feof(in)) {
if((ch=fgetc(in))==EOF) size_t rd = fread(buf, sizeof(uint8_t), sizeof(buf), in);
if(rd < 1)
break; break;
if(fputc(ch,out)==EOF) { if(fwrite(buf, sizeof(uint8_t), rd, out) != rd) {
success = FALSE; success = FALSE;
break; break;
} }
if(((count++)%(32*1024))==0)
MAYBE_YIELD(); MAYBE_YIELD();
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment