On Fri, 15 Oct 2010 05:49:05 +0400, Andrei Alexandrescu <[email protected]> wrote:

On 10/14/2010 07:57 PM, Denis Koroskin wrote:
In my original version there was a setbuf(f, null) call. I removed it
because it had 0 impact on performance.
I also tried using unistd open/read functions, that had zero impact, too

Yah, I looked more into the behavior of fread. At least on a couple of implementations that offer source, the implementation first copies whatever data is (if any) in the internal buffer, and then read the rest of the data straight into the remaining user-supplied buffer.

This means, if you consistently fread into a buffer, the internal buffers are never touched.

I stand corrected regarding the extra copy.

(btw, opening file with O_DIRECT returned valid file descriptor, but
read operations very failing with an invalid argument error).

I recall I've read a discussion where Linus was really down on O_DIRECT. Found it: http://kerneltrap.org/node/7563


Andrei

Yeah, I've read that.

Btw, I've re-run my tests, O_DIRECT works but also has no effect. Best of 3 results for parsing 33Mb log file:

using getline (C++ -O2):
real 0m0.081s
user 0m0.068s
sys 0m0.016s

using byLine (D -O -release -inline):
real 0m0.067s
user 0m0.056s
sys 0m0.012s

That's a 20% difference. Source and test files here:
http://rapidshare.com/files/425154119/tests.7z  309k
http://rapidshare.com/files/425154408/tests.zip 6Mb (in case you have no 7z installed)

Reply via email to