GNU/Linux >> Znalost Linux >  >> Linux

Proč je moje funkce cat se systémovými voláními pomalejší ve srovnání s kočkou v Linuxu?

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á.


Linux
  1. Monitorujte svůj systém Linux ve svém terminálu pomocí procps-ng

  2. Proč se držím xtermu

  3. Plánování systémových úloh pomocí Cronu na Linuxu

  1. Zlepšete výkon systému Linux pomocí noatime

  2. Pochopení systémových volání na Linuxu pomocí strace

  3. Proč jsem si zamiloval Antergos Linux

  1. Linux Shutdown Command (s příklady)

  2. Linux – celosystémové monitorování volání do funkce knihovny?

  3. 13 Základní systémová volání Linuxu vysvětlena pomocí zábavného virového programu Linux