Calling MB_CUR_MAX is much more expensive than incrementing a pointer
authorschwarze <schwarze@openbsd.org>
Thu, 13 Jan 2022 05:10:46 +0000 (05:10 +0000)
committerschwarze <schwarze@openbsd.org>
Thu, 13 Jan 2022 05:10:46 +0000 (05:10 +0000)
commit576410a5548d2319c6775b6c0f3b393a05501ab7
treea7fe21db731d4b4581f18250bd110503dd6f686f
parentb7cb00ef4e1671425d998debdf09fc5c410b9693
Calling MB_CUR_MAX is much more expensive than incrementing a pointer
and than testing and printing a byte, so do it once up front rather
than inside the inner loop.  This speeds up rev(1) by about a factor
of three for typical use cases.
Performance issue found by cheloha@, but my fix is a bit simpler
and more rigorous than Scott's original patch.

While here, also add the missing handling for write errors (making
them fatal, whereas read errors remain non-fatal and proceed to the
next input file) and also avoid testing each byte twice, making the
code more straightforward and more readable.

In part using ideas from millert@ and martijn@.
OK martijn@.
usr.bin/rev/rev.c