Part 1 Proposal for JDK-8264594
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Thu Jun 3 20:25:56 UTC 2021
Thanks.
While I agree that a segment is just a bunch of bytes, I think also
think that having an API which takes two indices at the same time, one
logical and one physical is kind of evil. I bet that a lot of developers
will get that wrong, at least the first time.
What you say about segments being an array of bytes, and thus not
needing index-based overloads can also be said for MemoryAccess class -
but I believe that the index-based accessors in the are quite popular.
But overall, my worry is not performances, or symmetry with respect to
other APIs - my main worry is what I said above: that people will just
assume that indices are logical for both the segment and the array - so
overloads with clearly different names should help quite a bit IMHO.
Maurizio
On 03/06/2021 20:50, leerho wrote:
> Maurizio,
> Here is the MemoryCopy class (w/o byte swap) and the TestMemoryCopy
> class (w/o testing byte swap).
>
> I copied from the TestMemoryAccess class in that I noticed that there
> is no package statement. I am not sure what @SuppressWarnings are
> allowed in your test environment, I suspect I should remove all of them.
>
> When the MemorySegment copyFrom(MemorySegment, MemoryLayout,
> ByteOrder) becomes available I can add the tests for that.
>
> *IMHO*
>
> I feel strongly that there is no need to additionally overload
> these methods with the segment offset specified in array index
> units. It is so trivial to convert from one to the other and it
> can be done easily in the method argument with a simple
> multiply by 2, 4 or 8. This should compile down to a simple shift,
> which becomes a single cycle CPU instruction. So this is not a
> performance issue.
>
> Furthermore, it is best that the user becomes accustomed to
> thinking of a segment fundamentally as an array of bytes. Once a
> segment is loaded with some primitive array, the segment loses the
> context of the type of the array it was loaded with; in effect, a
> kind of "type erasure" similar to Java's generics. This is one of
> the reasons that MemorySegments can be so powerful.
>
>
> I have been programming with the "MemorySegment" concept for a
> number of years now and find that keeping in mind that segments
> are just bytes is very useful.
>
>
> Let me know what you think.
>
> Lee.
>
>
>
> On Mon, May 31, 2021 at 6:56 AM Maurizio Cimadamore
> <maurizio.cimadamore at oracle.com
> <mailto:maurizio.cimadamore at oracle.com>> wrote:
>
> Hi Lee,
> this looks good.
>
> One thing I note is that there's an ambiguity as to whether the
> segment index is expressed as a logical index, or a raw byte
> offset. Your snippet does the latter. If we want to follow
> MemoryAccess, perhaps that calls for 2 overloads
> (copyFromArrayAtIndex/copyFromArrayAtOffset), as I imagine both
> could be useful, depending on the case?
>
> The javadoc will have to say something when the segment being used
> is backed by the very array that is the source/target of the copy
> (we have some text like that in MemorySegment::copyFrom).
>
> I think it would be helpful to progress further with this, add the
> remaining templates (w/o ByteOrder, for now) test and see how it
> works in practice.
>
> I will add (or just file a simple PR, so that you can just borrow
> from it - should be a single method) something to do the segment
> copy with swap.
>
> Thanks!
> Maurizio
>
> On 28/05/2021 22:37, leerho wrote:
>> Maurizio,
>>
>> Again sorry about the delay.
>>
>> Attached is a template proposal for the MemoryCopy class.
>>
>> I can't complete this without your proposed new copyFrom(...)
>> method in MemorySegment. As it is written, it should work, but
>> without the byte swap capability.
>>
>> I can complete the rest of the primitives like this template, if
>> you would like with javadocs. I could also start writing tests,
>> but without the byte-swap.
>>
>> Let me know what would be most helpful.
>>
>> Cheers,
>>
>> Lee
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> On Thu, May 20, 2021 at 11:36 AM leerho <leerho at gmail.com
>> <mailto:leerho at gmail.com>> wrote:
>>
>> Of course!
>>
>> On Thu, May 20, 2021 at 9:42 AM Maurizio Cimadamore
>> <maurizio.cimadamore at oracle.com
>> <mailto:maurizio.cimadamore at oracle.com>> wrote:
>>
>>
>> On 20/05/2021 17:13, leerho wrote:
>>> I am not sure if the /dstSegSlice/ requires the
>>> /srcCopyLen/. I would hope that it is smart enough to
>>> realize that the input length is smaller than the given
>>> offset minus the segment size.
>>
>> asSlice has an overload that just takes an offset and
>> infers the resulting size from there.
>>
>> But that doesn't seem what you want here - as you want
>> the slice to have a specific size (the size of the input
>> array).
>>
>> MemorySegment::copyFrom wants the two segments to have
>> the same size, so I think you need that.
>>
>> In terms of performance, there's no difference between
>> asSlice(offset) and asSlice(offset, size) - you have to
>> create a new segment anyway.
>>
>> Maurizio
>>
>>
More information about the panama-dev
mailing list