[ 
https://issues.apache.org/jira/browse/CASSANDRA-21536?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18099486#comment-18099486
 ] 

koo commented on CASSANDRA-21536:
---------------------------------

Thank you for the good suggestion.

I also included the read path.
Now writeValue(), read(), and skipValue() use the fixed length field in 
AbstractType.

I added a microbenchmark for both read and write.
The test uses mixed column types, so it can make the call megamorphic.

| Path | Before | After | Result |
|--:|-:|-:|--:|
| readValue | 49.99 M ops/s | 56.44 M ops/s | +12.90% |
| writeValue | 99.63 M ops/s | 114.46 M ops/s | +14.88% |

 

> Profile pollution in AbstractType.writeValue makes serialization slow for all 
> column types
> ------------------------------------------------------------------------------------------
>
>                 Key: CASSANDRA-21536
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-21536
>             Project: Apache Cassandra
>          Issue Type: Improvement
>            Reporter: koo
>            Priority: Normal
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> *Description:* 
> AbstractType.writeValue() is one shared method. All column types use it.
> Inside writeValue(), it calls valueLengthIfFixed(). This is a virtual call. 
> Many types override this method (Int32Type, LongType, UTF8Type, ...).
> In a real cluster, many column types pass through writeValue(). So the 
> profile always sees lots types. 
> Because of this, the JIT cannot inline the call. It stays as a vtable call. 
> Also, the compiled body of writeValue() becomes big, so the JIT refuses to 
> inline writeValue() itself ("already compiled into a big method").
> We also see the same itable/vtable stubs in async-profiler output from a real 
> cluster, running with default production options and a normal workload.
> *How to solve:*
> Add a final int field to AbstractType. Set it in the constructor. 
> writeValue() reads this field instead of calling valueLengthIfFixed().
> A field read needs no type profile. So profile pollution has no effect on it. 
> The valueLengthIfFixed() method is not changed. Only the write path uses the 
> field.
> *Result:*
> Production is always the polluted state, so this is the real-world comparison 
> || || before || after ||
> | M ops/s | 185.0 | 210.4 |
> | improvement | | +13.7% |
> | valueLengthIfFixed frames in profiler | 5.9% | 0% |



--
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