I've skimmed through the code and I'm not sure I can see any asynchronicity (you were pointing at the lack of it in BufferedReader).
And the mechanics of this is very puzzling to me, to be honest: void blockingFill(boolean forced) throws IOException { fill(forced); while (readPos == writePos) { try { Thread.sleep(100); } catch (InterruptedException e) { // An interrupt may mean more data is available } fill(forced); } } I thought you were suggesting that we should utilize the tools which OS provides more efficiently. Instead we have something that looks very similarly to a "busy loop" and... also who and when is supposed to interrupt Thread.sleep()? Sorry, I'm not following. Could you please explain how this is supposed to work? > On 24 Oct 2016, at 15:59, Brunoais <brunoa...@gmail.com> wrote: > > Attached and sending! > > > On 24/10/2016 13:48, Pavel Rappo wrote: >> Could you please send a new email on this list with the source attached as a >> text file? >> >>> On 23 Oct 2016, at 19:14, Brunoais <brunoa...@gmail.com> wrote: >>> >>> Here's my poc/prototype: >>> http://pastebin.com/WRpYWDJF >>> >>> I've implemented the bare minimum of the class that follows the same >>> contract of BufferedReader while signaling all issues I think it may have >>> or has in comments. >>> I also wrote some javadoc to help guiding through the class. >>> >>> I could have used more fields from BufferedReader but the names were so >>> minimalistic that were confusing me. I intent to change them before sending >>> this to openJDK. >>> >>> One of the major problems this has is long overflowing. It is major because >>> it is hidden, it will be extremely rare and it takes a really long time to >>> reproduce. There are different ways of dealing with it. From just >>> documenting to actually making code that works with it. >>> >>> I built a simple test code for it to have some ideas about performance and >>> correctness. >>> >>> http://pastebin.com/eh6LFgwT >>> >>> This doesn't do a through test if it is actually working correctly but I >>> see no reason for it not working correctly after fixing the 2 bugs that >>> test found. >>> >>> I'll also leave here some conclusions about speed and resource consumption >>> I found. >>> >>> I made tests with default buffer sizes, 5000B 15_000B and 500_000B. I >>> noticed that, with my hardware, with the 1 530 000 000B file, I was getting >>> around: >>> >>> In all buffers and fake work: 10~15s speed improvement ( from 90% HDD speed >>> to 100% HDD speed) >>> In all buffers and no fake work: 1~2s speed improvement ( from 90% HDD >>> speed to 100% HDD speed) >>> >>> Changing the buffer size was giving different reading speeds but both were >>> quite equal in how much they would change when changing the buffer size. >>> Finally, I could always confirm that I/O was always the slowest thing while >>> this code was running. >>> >>> For the ones wondering about the file size; it is both to avoid OS cache >>> and to make the reading at the main use-case these objects are for (large >>> streams of bytes). >>> >>> @Pavel, are you open for discussion now ;)? Need anything else? >>> >>> On 21/10/2016 19:21, Pavel Rappo wrote: >>>> Just to append to my previous email. BufferedReader wraps any Reader out >>>> there. >>>> Not specifically FileReader. While you're talking about the case of >>>> effective >>>> reading from a file. >>>> >>>> I guess there's one existing possibility to provide exactly what you need >>>> (as I >>>> understand it) under this method: >>>> >>>> /** >>>> * Opens a file for reading, returning a {@code BufferedReader} to read >>>> text >>>> * from the file in an efficient manner... >>>> ... >>>> */ >>>> java.nio.file.Files#newBufferedReader(java.nio.file.Path) >>>> >>>> It can return _anything_ as long as it is a BufferedReader. We can do it, >>>> but it >>>> needs to be investigated not only for your favorite OS but for other OSes >>>> as >>>> well. Feel free to prototype this and we can discuss it on the list later. >>>> >>>> Thanks, >>>> -Pavel >>>> >>>>> On 21 Oct 2016, at 18:56, Brunoais <brunoa...@gmail.com> wrote: >>>>> >>>>> Pavel is right. >>>>> >>>>> In reality, I was expecting such BufferedReader to use only a single >>>>> buffer and have that Buffer being filled asynchronously, not in a >>>>> different Thread. >>>>> Additionally, I don't have the intention of having a larger buffer than >>>>> before unless stated through the API (the constructor). >>>>> >>>>> In my idea, internally, it is supposed to use >>>>> java.nio.channels.AsynchronousFileChannel or equivalent. >>>>> >>>>> It does not prevent having two buffers and I do not intent to change >>>>> BufferedReader itself. I'd do an BufferedAsyncReader of sorts (any name >>>>> suggestion is welcome as I'm an awful namer). >>>>> >>>>> >>>>> On 21/10/2016 18:38, Roger Riggs wrote: >>>>>> Hi Pavel, >>>>>> >>>>>> I think Brunoais asking for a double buffering scheme in which the >>>>>> implementation of >>>>>> BufferReader fills (a second buffer) in parallel with the application >>>>>> reading from the 1st buffer >>>>>> and managing the swaps and async reads transparently. >>>>>> It would not change the API but would change the interactions between >>>>>> the buffered reader >>>>>> and the underlying stream. It would also increase memory requirements >>>>>> and processing >>>>>> by introducing or using a separate thread and the necessary >>>>>> synchronization. >>>>>> >>>>>> Though I think the formal interface semantics could be maintained, I >>>>>> have doubts >>>>>> about compatibility and its unintended consequences on existing >>>>>> subclasses, >>>>>> applications and libraries. >>>>>> >>>>>> $.02, Roger >>>>>> >>>>>> On 10/21/16 1:22 PM, Pavel Rappo wrote: >>>>>>> Off the top of my head, I would say it's not possible to change the >>>>>>> design of an >>>>>>> _extensible_ type that has been out there for 20 or so years. All these >>>>>>> I/O >>>>>>> streams from java.io were designed for simple synchronous use case. >>>>>>> >>>>>>> It's not that their design is flawed in some way, it's that they >>>>>>> doesn't seem to >>>>>>> suit your needs. Have you considered using >>>>>>> java.nio.channels.AsynchronousFileChannel >>>>>>> in your applications? >>>>>>> >>>>>>> -Pavel >>>>>>> >>>>>>>> On 21 Oct 2016, at 17:08, Brunoais <brunoa...@gmail.com> wrote: >>>>>>>> >>>>>>>> Any feedback on this? I'm really interested in implementing such >>>>>>>> BufferedReader/BufferedStreamReader to allow speeding up my >>>>>>>> applications without having to think in an asynchronous way or >>>>>>>> multi-threading while programming with it. >>>>>>>> >>>>>>>> That's why I'm asking this here. >>>>>>>> >>>>>>>> >>>>>>>> On 13/10/2016 14:45, Brunoais wrote: >>>>>>>>> Hi, >>>>>>>>> >>>>>>>>> I looked at BufferedReader source code for java 9 long with the >>>>>>>>> source code of the channels/streams used. I noticed that, like in >>>>>>>>> java 7, BufferedReader does not use an Async API to load data from >>>>>>>>> files, instead, the data loading is all done synchronously even when >>>>>>>>> the OS allows requesting a file to be read and getting a warning >>>>>>>>> later when the file is effectively read. >>>>>>>>> >>>>>>>>> Why Is BufferedReader not async while providing a sync API? >>>>>>>>> >> > > <BufferedNonBlockStream.java><Tests.java>