[foreign-jextract] RFR: MemorySegmentPool + Allocator [v7]
Radoslaw Smogura
github.com+7535718+rsmogura at openjdk.java.net
Wed Apr 21 23:41:33 UTC 2021
On Wed, 21 Apr 2021 23:37:15 GMT, Radoslaw Smogura <github.com+7535718+rsmogura at openjdk.org> wrote:
>> (Preview)
>>
>> The MemorySegmentPool is a pool maintaining memory segments, optionally can expose allocator which can be bound to other scope, and which will return allocated segments back to pool.
>>
>> However the best results has been achieved by using getSegmentEntry & putSegmentEntry methods.
>>
>> The pool is intended to be used by long running applications (i.e. like global shared pool), where fast allocation and de-allocation of segments is critical (was designed during implementation of I/O subsystem with Panama, as a pool for temporary buffers between system I/O methods and Java byte arrays from InputStreams).
>>
>> The pool uses hand-made SpinLockQueue as the Deque from JDK offers too much functionality and overhead.
>
> Radoslaw Smogura has updated the pull request incrementally with two additional commits since the last revision:
>
> - Better releasing resources on scopes close
> New benchamarks for bulk allocations
> - Minor fixes to SpinLockQueue
> Remove redundant LOCK release (set to 0) in put entry.
> Fixed maxSize comparison
> Removed unused imports
>
> Q: Could we reduce setRelease to just set in few places?
> Q: Should this method be private and moved to Entry.close to prevent accidental adding element from other queue?
Hi,
It's still bit messy, but I worked on managing releasing on scope(s) close - I hope all cases are handled.
I think the method addOrCleanUpIfFail should be a public API. I think it could provide some argument indicating reason of calling (clean up or fail in clean up), or the clean up callback interface could be split into two methods cleanup and fail. Just an observation.
I'm adding new set of benchamarks
Benchmark (size) Mode Cnt Score Error Units
StrLenTest.jni_strlen 5 avgt 30 103.968 ? 0.901 ns/op
StrLenTest.jni_strlen 20 avgt 30 116.378 ? 2.838 ns/op
StrLenTest.jni_strlen 100 avgt 30 180.812 ? 4.355 ns/op
StrLenTest.panama_strlen 5 avgt 30 118.095 ? 2.401 ns/op
StrLenTest.panama_strlen 20 avgt 30 120.401 ? 0.515 ns/op
StrLenTest.panama_strlen 100 avgt 30 162.540 ? 7.410 ns/op
StrLenTest.panama_strlen_arena 5 avgt 30 35.753 ? 0.345 ns/op
StrLenTest.panama_strlen_arena 20 avgt 30 48.421 ? 1.136 ns/op
StrLenTest.panama_strlen_arena 100 avgt 9 94.138 ? 6.826 ns/op
StrLenTest.panama_strlen_memsegmentpool_allocator 5 avgt 30 61.217 ? 3.955 ns/op
StrLenTest.panama_strlen_memsegmentpool_allocator 20 avgt 30 65.178 ? 2.817 ns/op
StrLenTest.panama_strlen_memsegmentpool_allocator 100 avgt 30 78.562 ? 0.389 ns/op
StrLenTest.panama_strlen_memsegmentpool_direct 5 avgt 30 33.454 ? 0.508 ns/op
StrLenTest.panama_strlen_memsegmentpool_direct 20 avgt 30 36.430 ? 0.222 ns/op
StrLenTest.panama_strlen_memsegmentpool_direct 100 avgt 30 53.350 ? 0.349 ns/op
StrLenTest.panama_strlen_prefix 5 avgt 30 26.351 ? 0.258 ns/op
StrLenTest.panama_strlen_prefix 20 avgt 30 33.453 ? 0.639 ns/op
StrLenTest.panama_strlen_prefix 100 avgt 30 61.366 ? 0.351 ns/op
StrLenTest.panama_strlen_unsafe 5 avgt 30 41.748 ? 0.226 ns/op
StrLenTest.panama_strlen_unsafe 20 avgt 30 46.536 ? 0.582 ns/op
StrLenTest.panama_strlen_unsafe 100 avgt 30 66.818 ? 1.365 ns/op
StrLenTest.panama_strlen_unsafe_trivial 5 avgt 30 27.182 ? 0.148 ns/op
StrLenTest.panama_strlen_unsafe_trivial 20 avgt 30 32.676 ? 0.203 ns/op
StrLenTest.panama_strlen_unsafe_trivial 100 avgt 30 60.266 ? 0.219 ns/op
AllocatorsForLongRun.arena 1 avgt 10 233.854 ? 0.825 ns/op
AllocatorsForLongRun.arena 16 avgt 10 692.773 ? 8.502 ns/op
AllocatorsForLongRun.arena 200 avgt 10 7192.740 ? 300.275 ns/op
AllocatorsForLongRun.malloc_free 1 avgt 10 29.676 ? 0.655 ns/op
AllocatorsForLongRun.malloc_free 16 avgt 10 600.062 ? 17.034 ns/op
AllocatorsForLongRun.malloc_free 200 avgt 10 9672.720 ? 279.714 ns/op
AllocatorsForLongRun.pool_allocator 1 avgt 10 34.617 ? 0.154 ns/op
AllocatorsForLongRun.pool_allocator 16 avgt 10 363.034 ? 1.444 ns/op
AllocatorsForLongRun.pool_allocator 200 avgt 10 4559.017 ? 14.477 ns/op
AllocatorsForLongRun.pool_allocator_exhausted 1 avgt 10 69.087 ? 0.449 ns/op
AllocatorsForLongRun.pool_allocator_exhausted 16 avgt 10 1006.549 ? 28.121 ns/op
AllocatorsForLongRun.pool_allocator_exhausted 200 avgt 10 16081.760 ? 282.773 ns/op
AllocatorsForLongRun.pool_direct 1 avgt 10 17.413 ? 0.069 ns/op
AllocatorsForLongRun.pool_direct 16 avgt 10 292.933 ? 1.274 ns/op
AllocatorsForLongRun.pool_direct 200 avgt 10 5381.742 ? 8.380 ns/op
-------------
PR: https://git.openjdk.java.net/panama-foreign/pull/509
More information about the panama-dev
mailing list