[ 
https://issues.apache.org/jira/browse/CASSANDRA-21359?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Dmitry Konstantinov updated CASSANDRA-21359:
--------------------------------------------
    Description: 
background: 10 rows partition read test, CASSANDRA-21354 change applied

* org.apache.cassandra.utils.MergeIterator.Candidate - has Comparator field 
which is the same for all Candidates  under an MergeIterator instance, we can 
move the field to MergeIterator level. Candidate is 4.8% of all allocations and 
we can save 20% (~1% of all allocations) of it for JDK 21 with compressed 
references on.
{code}
org.apache.cassandra.utils.MergeIterator$Candidate object internals:
OFF  SZ                   TYPE DESCRIPTION               VALUE
  0   8                        (object header: mark)     N/A
  8   4                        (object header: class)    N/A
 12   4                    int Candidate.idx             N/A
 16   1                boolean Candidate.equalParent     N/A
 17   3                        (alignment/padding gap)   
 20   4     java.util.Iterator Candidate.iter            N/A
 24   4   java.util.Comparator Candidate.comp            N/A
 28   4       java.lang.Object Candidate.item            N/A
 32   4       java.lang.Object Candidate.lowerBound      N/A
 36   4                        (object alignment gap)    
Instance size: 40 bytes
{code}
without comp we dropped to 32 bytes, so 20% less object size
{code}
OFF  SZ                 TYPE DESCRIPTION               VALUE
  0   8                      (object header: mark)     N/A
  8   4                      (object header: class)    N/A
 12   4                  int Candidate.idx             N/A
 16   1              boolean Candidate.equalParent     N/A
 17   3                      (alignment/padding gap)   
 20   4   java.util.Iterator Candidate.iter            N/A
 24   4     java.lang.Object Candidate.item            N/A
 28   4     java.lang.Object Candidate.lowerBound      N/A
Instance size: 32 bytes
{code}
 !image-2026-05-09-15-14-10-274.png|width=400! 
* we can switch from ArrayList to array in 
org.apache.cassandra.db.rows.Row.Merger 
The ArrayList iterator costs 0.72% and BulkIterator.Adapter costs 0.35%. So, in 
total we can save here ~1% of total allocations.
 !image-2026-05-09-15-26-52-036.png|width=400! 


  was:
background: 10 rows partition read test, CASSANDRA-21354 change applied

* org.apache.cassandra.utils.MergeIterator.Candidate - has Comparator field 
which is the same for all Candidates  under an MergeIterator instance, we can 
move the field to MergeIterator level. Candidate is 4.8% of all allocations and 
we can save 20% (~1%) of it for JDK 21 with compressed references on.
{code}
org.apache.cassandra.utils.MergeIterator$Candidate object internals:
OFF  SZ                   TYPE DESCRIPTION               VALUE
  0   8                        (object header: mark)     N/A
  8   4                        (object header: class)    N/A
 12   4                    int Candidate.idx             N/A
 16   1                boolean Candidate.equalParent     N/A
 17   3                        (alignment/padding gap)   
 20   4     java.util.Iterator Candidate.iter            N/A
 24   4   java.util.Comparator Candidate.comp            N/A
 28   4       java.lang.Object Candidate.item            N/A
 32   4       java.lang.Object Candidate.lowerBound      N/A
 36   4                        (object alignment gap)    
Instance size: 40 bytes
{code}
without comp we dropped to 32 bytes, so 20% less object size
{code}
OFF  SZ                 TYPE DESCRIPTION               VALUE
  0   8                      (object header: mark)     N/A
  8   4                      (object header: class)    N/A
 12   4                  int Candidate.idx             N/A
 16   1              boolean Candidate.equalParent     N/A
 17   3                      (alignment/padding gap)   
 20   4   java.util.Iterator Candidate.iter            N/A
 24   4     java.lang.Object Candidate.item            N/A
 28   4     java.lang.Object Candidate.lowerBound      N/A
Instance size: 32 bytes
{code}
 !image-2026-05-09-15-14-10-274.png|width=400! 
* we can switch from ArrayList to array in 
org.apache.cassandra.db.rows.Row.Merger 
The ArrayList iterator costs 0.72% and BulkIterator.Adapter costs 0.35%. So, in 
total we can save here ~1% of total allocations.
 !image-2026-05-09-15-26-52-036.png|width=400! 



> Reduce allocation in row merge logic
> ------------------------------------
>
>                 Key: CASSANDRA-21359
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-21359
>             Project: Apache Cassandra
>          Issue Type: Improvement
>          Components: Local/Other
>            Reporter: Dmitry Konstantinov
>            Assignee: Dmitry Konstantinov
>            Priority: Normal
>         Attachments: image-2026-05-09-15-14-10-274.png, 
> image-2026-05-09-15-26-52-036.png
>
>
> background: 10 rows partition read test, CASSANDRA-21354 change applied
> * org.apache.cassandra.utils.MergeIterator.Candidate - has Comparator field 
> which is the same for all Candidates  under an MergeIterator instance, we can 
> move the field to MergeIterator level. Candidate is 4.8% of all allocations 
> and we can save 20% (~1% of all allocations) of it for JDK 21 with compressed 
> references on.
> {code}
> org.apache.cassandra.utils.MergeIterator$Candidate object internals:
> OFF  SZ                   TYPE DESCRIPTION               VALUE
>   0   8                        (object header: mark)     N/A
>   8   4                        (object header: class)    N/A
>  12   4                    int Candidate.idx             N/A
>  16   1                boolean Candidate.equalParent     N/A
>  17   3                        (alignment/padding gap)   
>  20   4     java.util.Iterator Candidate.iter            N/A
>  24   4   java.util.Comparator Candidate.comp            N/A
>  28   4       java.lang.Object Candidate.item            N/A
>  32   4       java.lang.Object Candidate.lowerBound      N/A
>  36   4                        (object alignment gap)    
> Instance size: 40 bytes
> {code}
> without comp we dropped to 32 bytes, so 20% less object size
> {code}
> OFF  SZ                 TYPE DESCRIPTION               VALUE
>   0   8                      (object header: mark)     N/A
>   8   4                      (object header: class)    N/A
>  12   4                  int Candidate.idx             N/A
>  16   1              boolean Candidate.equalParent     N/A
>  17   3                      (alignment/padding gap)   
>  20   4   java.util.Iterator Candidate.iter            N/A
>  24   4     java.lang.Object Candidate.item            N/A
>  28   4     java.lang.Object Candidate.lowerBound      N/A
> Instance size: 32 bytes
> {code}
>  !image-2026-05-09-15-14-10-274.png|width=400! 
> * we can switch from ArrayList to array in 
> org.apache.cassandra.db.rows.Row.Merger 
> The ArrayList iterator costs 0.72% and BulkIterator.Adapter costs 0.35%. So, 
> in total we can save here ~1% of total allocations.
>  !image-2026-05-09-15-26-52-036.png|width=400! 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to