[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