Vova,

You still can't write the first buffer to channel before the whole message
is serialized. Are you going to have multiple write buffers? I'm confused :)

-Val

On Fri, Oct 14, 2016 at 1:49 PM, Vladimir Ozerov <voze...@gridgain.com>
wrote:

> Val,
>
> No need to copy on write. You simply reserve 5 bytes before writing the
> object, and put them after object is finished.
>
> If object is split between two buffers, you set special marker, meaning
> that the next part is to follow in the next chunk.
>
> Vladimir.
>
> 14 окт. 2016 г. 22:36 пользователь "Valentin Kulichenko" <
> valentin.kuliche...@gmail.com> написал:
>
> > Vova,
> >
> > I meant the copy on write. To know the length you need to fully marshal
> > message first. This means that you will always copy the array before
> > writing to channel. Unless I'm missing something, this eliminates the
> > purpose of direct serialization.
> >
> > -Val
> >
> > On Thu, Oct 13, 2016 at 11:09 PM, Vladimir Ozerov <voze...@gridgain.com>
> > wrote:
> >
> > > Valya,
> > >
> > > Yes, in this design we will copy data into separate buffer on read. But
> > > what is important - it will happen only for message which is split
> > between
> > > buffers.
> > >
> > > On Fri, Oct 14, 2016 at 2:33 AM, Valentin Kulichenko <
> > > valentin.kuliche...@gmail.com> wrote:
> > >
> > > > Vladimir,
> > > >
> > > > We don't write length because be don't know it in advance. Sounds
> like
> > > > you're proposing to marshal the message first and then copy it to the
> > > write
> > > > buffer. But that's actually our previous implementation and the whole
> > > > purpose of direct serialization was to avoid this copy.
> > > >
> > > > The optimization for writes sounds interesting, though.
> > > >
> > > > -Val
> > > >
> > > > On Thu, Oct 13, 2016 at 3:51 AM, Vladimir Ozerov <
> voze...@gridgain.com
> > >
> > > > wrote:
> > > >
> > > > > Writes can be optimized even further:
> > > > > 1) Write to *ByteBuffer *as long as there is a place in it.
> > > > > 2) When it is full - invoke a callback which will submit it to the
> > > > socket,
> > > > > reset position to 0, and continue marshaling.
> > > > >
> > > > > This way we can probably get rid of write "state" at all.
> > > > >
> > > > > On Thu, Oct 13, 2016 at 1:17 PM, Vladimir Ozerov <
> > voze...@gridgain.com
> > > >
> > > > > wrote:
> > > > >
> > > > > > Folks,
> > > > > >
> > > > > > I went through our so-called "direct serialization" and appears
> to
> > be
> > > > not
> > > > > > very efficient to me. We never write message length. As a result
> we
> > > > have
> > > > > to
> > > > > > constantly track what was written and what was not, and whether
> we
> > > > have a
> > > > > > room for the next write. The same goes for reader. As a result
> even
> > > > > single
> > > > > > "writeInt" is surrounded with multiple checks and writes.
> > > > > >
> > > > > > It looks like we can make our algorithm much more simple,
> > > > straightforward
> > > > > > and efficient if we add two things to every message:
> > > > > > - Message length
> > > > > > - Flag indicating whether it was written fully or not.
> > > > > >
> > > > > > If message was written fully to the buffer, we do no need to
> > perform
> > > > any
> > > > > > checks during deserialization. To read int it is enough to call
> > > > > > *ByteBuffer.getInt()*. To read byte array it is enough to call
> > > > > > *ByteBuffer.getByte()*, etc. Simple and fast.
> > > > > >
> > > > > > And only if message was split into pieces on either send or
> receive
> > > > > sides,
> > > > > > which should not happen often, we may want to fallback to current
> > > > > > implementation. Or may be we may copy such message  to a separate
> > > > buffer
> > > > > > and still read them without any boundaries checks and
> > > > "incrementStates".
> > > > > >
> > > > > > Thoughts?
> > > > > >
> > > > > > Vladimir.
> > > > > >
> > > > >
> > > >
> > >
> >
>

Reply via email to