<http://www.mailinator.com/tymaPaulMultithreaded.pdf>
Some discussion may be found here:
<http://developers.slashdot.org/story/10/07/27/1925209>
The few times the choice has come up, we implemented synchronous I/O,
profiled it, found it met the requirements and declared victory. Lacking
much experience in this area, I'd welcome critical comments.
--
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>
On a related note, if "old" I/O meets your requirements then what more
do you need? :-) I've been generally content with "old" I/O in most
situations.
And as an aside, one thing I noticed with NIO when it came out,
specifically concerning use of the Selector, was that the new API
promoted a fair bit of black-box copy-paste programming. Admittedly I
have only a small set of observations, but quite frankly the only time I
ran across a group of people that thoroughly understood their NIO code
was when their original code had been C code and they were using the
select() call there. It might perhaps be more accurate to say that NIO
did not *promote* this copy-paste programming; it simply perpetuated it
- it wasn't easier for the average programmer to understand than "old" I/O.
AHS
--
I'm not a vegetarian because I love animals. I'm a vegetarian because I
hate plants.
-- AW Brown
As far as efficiency goes, my guess is that there is a sweet-spot for
the number of streams-per-thread which outperforms regular IO. This
sweet-spot would depend on many factors, including overall system-load,
threading implementation, low-level select implementation, and stream
throughput.
Just a thought.
--
Daniel Pitts' Tech Blog: <http://virtualinfinity.net/wordpress/>
Thanks, both, for commenting on this. I also found this thread helpful:
<http://groups.google.com/group/comp.lang.java.programmer/browse_frm/thread/dd8005f33b883d02>
You should also have a look at 'Taming the NIO Circus' at
forums.sun.com: http://forums.sun.com/thread.jspa?threadID=459338&start=0
Your observations are true. If I were to make my point another way, it
would be that it's human nature to equate "more capable" with "easier to
use". When Java NIO appeared in 1.4 it wasn't advertised as being
easier, but it was certainly advertised - frequently - as "fixing" Java
I/O. No small number of Java programmers, the majority of them
relatively inexperienced (and I mean inexperienced both in the language
and in matters I/O), took "fixed" to mean "prefer NIO to 'old'
I/O"...which wasn't necessarily the right choice. Because, as you point
out, it's often more complicated to get NIO right.
Thank you for this link; the code is exemplary: both commendable and
cautionary. It highlights Daniel Pitts' point that NIO tends to be more
complex. Mindful of AHS's observation that the inexperienced tend to
prefer NIO without good reason, I am always looking for heuristics that
might inform the right choice.
I'm not going to make this a hard recommendation, but speaking only for
myself I've found that my comfort level with Java I/O, both "old" and
"new", has been enhanced by tackling all of the equivalent situations in
C (usually) over the decades. By doing so one tends to have a better
understanding, for I/O specifically, of what Java is doing under the
hood on your system.
AHS
--
Give a man a fish, and he can eat for a day. But teach a man how to
fish, and he'll be dead of mercury poisoning inside of three years.
--Charles Haas
The Sun (Oracle) JRE uses NIO to implement java.io. I'd bet that for
90% of the cases the performance of java.io routines should be the same
as for using raw java.nio classes and routines. I think the reason that
using NIO appears worse some of the time may be because the NIO API
is harder for many programmers to use to full advantage. (OT: I worry
about the new date and time API for the same reason.)
I agree with Arved that studying the implementation details of the *IO
libraries would enhance a programmer's ability to choose the correct API
to fit a given situation, and to use it to best advantage. But I think it
may be a mistake to design such complex APIs that this kind of investment
in time and effort, to master just a small part of the standard library,
is necessary. "Feature Creep" will be the death of Java.
--
Wayne