Aha, na základě vaší úpravy vás kousal buffer pro předčítání. Nemůžete otestovat dva programy, které čtou soubory vedle sebe, tím, že je spustíte jednou. První je vždy pomalejší, protože soubor je na disku, jakmile je soubor v paměti, druhý poběží rychleji, musíte buď vytvořit nová data pro každý, nebo spustit jeden a pak spustit oba, aby oba získali výhodu předčítání.
Možná jste kompilovali bez optimalizace (nebo bez tak vysokého nastavení optimalizace)?
Váš kód také zavolá sysWriteBuffer
jednou pomocí readBytes
rovna nule – možná to (částečně) vysvětluje?
Můžete také vložit sysWriteBuffer (buď pomocí přepínače kompilátoru nebo ručně).
"vložení" znamená zkopírovat tělo funkce na její místo volání, aby se odstranila režie volání funkce. Někdy to kompilátory dělají automaticky (myslím, že -O3 umožňuje tuto optimalizaci v gcc). Můžete také použít inline
klíčové slovo v gcc, které řekne kompilátoru, aby vložil funkci. Pokud to uděláte, vaše prohlášení bude vypadat takto:
static inline int sysWriteBuffer(int fdout, char *buffer, ssize_t readBytes) {
....
Prozkoumejte mmap(2).
Budete zahazovat jemnosti ftell/fread, ale přeskočí vrstvu nepřímosti, pokud je propustnost čtení opravdu důležitá.