Path: csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Rainer Weikusat Newsgroups: de.comp.os.unix.programming Subject: Re: mmap oder read? Date: Thu, 09 Jun 2022 15:17:54 +0100 Lines: 34 Message-ID: <87v8t9ncod.fsf@doppelsaurus.mobileactivedefense.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: individual.net Gn+Y8y9Bn/QVN4267AcuUAFZ7sWB3HjYUKBkaeIn8DtulYVRw= Cancel-Lock: sha1:cpUKAERqYF7R1Qxvcr9vlWL6rOE= sha1:mJ5z1nMBovgSFE/hgnGV9RK09qg= User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.5 (gnu/linux) Xref: csiph.com de.comp.os.unix.programming:3002 Jakob Hirsch writes: > On 2022-06-08 17:46, Stefan Reuther wrote: >> Was für Gründe kann es geben, sich bewusst für die eine oder die andere >> Art zu entscheiden? Bisher bin ich - wie gesagt, Framework > > TLDR: Wenn man nur sequentiell liest, lohnt sich das wohl nur bei > "großen" Dateien. Die Grenze liegt wohl irgendwo zwischen 1 und 8 MiB, > wie man z.B. unter https://github.com/david-slatinek/c-read-vs.-mmap > sieht (Werte sind bei mir ähnlich, hab allerdings nicht den code > angeschaut). Der Sinn von mmap ist zweierlei: - es ist einfacher zu benutzen, weil man sich Speicherverwaltung und tatsächliche I/O sparen kann - es ermöglicht es, Dateien, auf die nur lesend zugegriffen wird und die von potentiell vielen Prozessen benutzt werden, nur einmal im Speicher zu haben Letzteres betrifft vor allem Bibliothek- und Programmdateien. Es ist kein magischer Performance-Hack. Weil per saldo alles, was man bei open/malloc/read/close/free in der Anwendung tun müßte, auch so getan werden muß, nur vom Kernel, ist das auch nicht zu erwarten. Im ganzen gesehen, ist es aber (aus denselben Gründen) auch nicht 'langsamer', lediglich fallen die Laufzeitkosten woanders an[*] (und zwar da, wo sie naive Microbenchmarks betreffen). [*] Ein Bespiel: Wenn man malloc benutzt, um einen Puffer anzufordern, treten die Laufzeitkosten dafür, eine entsprechende Anzahl Speicherseiten in den Addreßraum das Prozesses zu kriegen entweder während malloc auf oder sie traten zu einem (programmtechnisch gesehen) längst verganenem Zeitpunk auf. Bei mmap hat man sie beim ersten Zugriff auf die Daten.