Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 28 Feb 2010 16:30:04 GMT
From:      Alexander Best <alexbestms@wwu.de>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: bin/86485: [patch] hexdump(1): hexdump -s speedup on /dev
Message-ID:  <201002281630.o1SGU4rH024548@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/86485; it has been noted by GNATS.

From: Alexander Best <alexbestms@wwu.de>
To: <bug-followup@FreeBSD.org>
Cc: Garrett Cooper <yaneurabeya@gmail.com>,
 Toby Peterson <toby@apple.com>
Subject: Re: bin/86485: [patch] hexdump(1): hexdump -s speedup on /dev
Date: Sun, 28 Feb 2010 17:29:51 +0100 (CET)

 i can't verify the performance decrease running HEAD (r204383) garrett
 mentioned. here are some benchmark (hexdump being the unpatched binary and
 =2E/hexdump including toby's patches):
 
 time hexdump -n 2 -s 999999999 /dev/zero  4,45s user 0,43s system 98% cpu
 4,938 total
 
 time ./hexdump -n 2 -s 999999999 /dev/zero  0,00s user 0,00s system 89% cpu
 0,005 total
 
 however while the unpatched hexdump binary succeeds doing
 
 hexdump -n 2 -s 99999999 /dev/ada0  0,52s user 0,52s system 19% cpu 5,418
 total
 
 the patched binary outputs a warning
 
 hexdump: /dev/ada0: Invalid argument
 5f5e0ff
 =2E/hexdump -n 2 -s 99999999 /dev/ada0  0,00s user 0,00s system 89% cpu 0,0=
 06
 total
 
 to me the patch doesn't look right however, because
 
 1. if a file is not seekable, fseeko() shouldn't be used. so the
 
 "if (S_ISREG(sb.st_mode))"
 
 statement should stay. removing it causes the warning i got during
 benchmarking, because fseeko() itself outputs a warning if it's being run o=
 n a
 non-seekable file.
 2. the real cause for the slowdown on non-seekable files is the use of
 getchar() which is testing whether EOF has been reached using a blocksize o=
 f 1
 byte.
 
 dd is much faster when dealing with non-seekable files. the difference howe=
 ver
 is that dd won't accept a seek value which is bigger than the filesize.
 hexdump on the other hand will accept any seek value. if it's bigger than t=
 he
 filesize it outputs the last byte(s) before the EOF.
 
 the dd code dealing with non-seekable files can be found in
 /usr/src/bin/dd/position.c:pos_in()
 
 maybe it's possible to use some of it to get rid of getchar().
 
 cheers.
 alex



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201002281630.o1SGU4rH024548>