read vs. mmap (or io vs. page faults)

Mikhail Teterin mi+kde at aldan.algebra.com
Sun Jun 20 00:43:29 PDT 2004


Hello!

I'm writing a message-digest utility, which operates on file and
can use either stdio:

	while (not eof) {
		char buffer[BUFSIZE];
		size = read(.... buffer ...);
		process(buffer, size);
	}

or mmap:

	buffer = mmap(... file_size, PROT_READ ...);
	process(buffer, file_size);

I expected the second way to be faster, as it is supposed to avoid
one memory copying (no user-space buffer). But in reality, on a
CPU-bound (rather than IO-bound) machine, using mmap() is considerably
slower. Here are the tcsh's time results:

	Single Pentium2-400MHz running 4.8-stable:
	------------------------------------------
stdio:	56.837u 34.115s 2:06.61 71.8%   66+193k 11253+0io 3pf+0w
mmap:	72.463u 7.534s 2:34.62 51.7%    5+186k 105+0io 22328pf+0w

	Dual Pentium2 Xeon 450MHz running recent -current:
	--------------------------------------------------
stdio:	36.557u 29.395s 3:09.88 34.7%   10+165k 32646+0io 0pf+0w
mmap:	42.052u 7.545s 2:02.25 40.5%    10+169k 16+0io 15232pf+0w

On the IO-bound machine, using mmap is only marginally faster:

	Single Pentium4M (Centrino 1GHz) runing recent -current:
	--------------------------------------------------------
stdio:	27.195u 8.280s 1:33.02 38.1%    10+169k 11221+0io 1pf+0w
mmap:	26.619u 3.004s 1:23.59 35.4%    10+169k 47+0io 19463pf+0w

Notice the last two columns in time's output -- why is page-faulting a
page in -- on-demand -- so much slower then read()-ing it? I even tried
inserting ``madvise(buffer, file_size, MADV_SEQUENTIAL)'' between the
mmap() and the process() -- made difference at all (or made the mmap()
take slightly longer)...

I this how things are supposed to be, or will mmap() become more
efficient eventually? Thanks!

	-mi





More information about the freebsd-questions mailing list