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

Emond Papegaaij commented on WICKET-6774:
-----------------------------------------

We should be very careful with these micro benchmarks. Your numbers already 
show a very interesting case: your testcase contains an error on component2. It 
is constructed with the same parameters as component0, still the numbers are 
way off. Either your actual testcase is somewhat different or the difference in 
numbers has a whole different cause. It can be a difference in memory 
allocation, but it can also be that your system is throttling down due to heat 
or power consumption. Interestingly enough, I'm seeing similar numbers. I don't 
have a good explanation.

More importantly, we are only testing detach. I'm not saying that detach 
performance can be increased, but this case is very limited. During detach of 
your testcase, {{setMetaData}} is called many times with data = null. This is 
the only call to any of the state of the components. Therefore, it makes sense 
that in this particular case performance is limited by this call, and 
eliminating it will increase performance for this case. However, this is not a 
typical application and the other elements of the state are accessed by other 
parts of Wicket. Optimizing for this case may reduce performance for the other 
(probably more important) cases.

That being said, I do think we should continue profiling and benchmarking 
component state, but in a richer setup. I've continued to improve the 
performance of my branch. For the detach case, I'd consider it on par with or 
faster than master.

I think we should add the feedback flag. The setMetaData call per component is 
a lot more expensive than a simple flag check. Not many components do have 
feedback.

> Separate model, behaviors and metadata into separate fields
> -----------------------------------------------------------
>
>                 Key: WICKET-6774
>                 URL: https://issues.apache.org/jira/browse/WICKET-6774
>             Project: Wicket
>          Issue Type: Improvement
>          Components: wicket-core
>    Affects Versions: 9.0.0-M5
>            Reporter: Thomas Heigl
>            Priority: Major
>         Attachments: benchmarks.png
>
>
> While investigating performance issues with metadata in WICKET-6771, I 
> discovered that significant performance gains can be achieved by separating 
> models, behaviors, and metadata into separate fields.
> Currently, all three types of data are stored in a single, untyped field 
> {{Component.data}}. The idea is to minimize memory overhead by creating as 
> few objects as possible.
> If a model or a single behavior or metadata is added, {{data}} stores only a 
> reference to the object. When additional data is added, the reference becomes 
> an array.
> This is the most memory-efficient way to store these three types of data. But 
> it comes with a cost: code to manipulate that data structure is complex and 
> not as efficient because it has to take all possible combinations of data 
> into account.
> I suggest introducing 3 separate fields for the 3 types of data, trading a 
> little bit of memory for reduced complexity and performance gains.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to