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

Thomas Andraschko commented on MYFACES-3664:
--------------------------------------------

thanks for your effort Leo.
Will you also do another performance/memory/troughput comparison after 2.2 
release? Would be great!

> JSF View Pooling (going beyond JSF Stateless Mode)
> --------------------------------------------------
>
>                 Key: MYFACES-3664
>                 URL: https://issues.apache.org/jira/browse/MYFACES-3664
>             Project: MyFaces Core
>          Issue Type: New Feature
>          Components: JSR-344
>            Reporter: Leonardo Uribe
>            Assignee: Leonardo Uribe
>         Attachments: myfacesStatelessMode-12-view-pool.patch, 
> myfacesStatelessMode-6-view-pool.patch, myfacesStatelessMode-8-view-pool.patch
>
>
> In the last months, I have been doing some investigations around "stateless 
> JSF" ideas. The intention is try to find ways to improve MyFaces Core 
> performance as much as possible, without lose all those nice features we all 
> are used to.
> In summary, the justification around stateless JSF is that, if it is possible 
> to cut the build view time from a request, there will be an improvement from 
> both speed and memory perspective. This is true, but only to some point, 
> because the response time for a request is given by the build view, 
> validation/invoke application and render response time. 
> To get to the same goal, without sacrifice JSF stateful behavior, other 
> improvements has been already done (cache EL expressions, cache ids, make 
> tree structure lighter, ...). The idea is cache that "stateless information" 
> into a place where it can be reused effectively, which in this case is inside 
> Facelet abstract syntax tree (AST). This has worked well so far. The side 
> effects of enable these optimizations has been analysed, and there is a good 
> understanding about this.
> In few words, the basic idea about stateless JSF as proposed originally by 
> Rudi Simic in his blog is this:
> Mark the view as stateless using some attribute.
> Use a pool of views, because views are not thread safe.
> Before store the view in the pool, use a visitTree call to reset the fields.
> Unfortunately, it was quickly found that the implementation proposed requires 
> a better view pool and try to reset the fields is not fail-safe, because the 
> component tree also stores more than just the input field values. 
> Additionally, it doesn't provide a way to use it for dynamic views.
> Provide a thread safe implementation of UIComponent that can be reused across 
> threads is not a  good solution, because anyway there is some information 
> that is inside UIComponent and should be stored per thread, and precisely 
> UIComponent is a place specifically designed to store that information.
> Based on the previous background, the big question is if a solution based on 
> object pooling pattern can be done effectively for a web framework like JSF. 
> A good description of the technique and its trade-off can be found at:
> http://en.wikipedia.org/wiki/Object_pool_pattern 
> In few words, the proposal is go "Beyond JSF Stateless Mode", and instead 
> blame the state, make it your friend. Let's just take advantage of the 
> stateful nature of JSF to allow reuse views fully or partially. 
> How? 
> - PSS algorithm can be used to check if a view has been modified or not, 
> checking its state. So, it can be used to check which components has state, 
> and if it is possible to provide a way to reset the state of a component to 
> the initial state set by the first markInitialState(), restore the state is 
> possible.
> -If the view cannot be reset fully, it is possible to use facelets refreshing 
> algorithm and reuse a view partially.
> - Add some additional code to recover a view instance when it is discarded, 
> and store it into the view pool. This requires some changes over 
> NavigationHandlerImpl, because it is not possible to reuse a view and store 
> it in the pool that is still on usage, so it is necessary to do a "deferred 
> navigation", changing the default ActionListenerImpl and ensure 
> handleNavigation() is called before end invoke application phase but outside 
> the visitTree() call.
> - In MyFaces there exists the concept of FaceletState. It is possible to use 
> this concept and cache even dynamic views, because each different 
> FaceletState can identify an specific view structure. 



--
This message was sent by Atlassian JIRA
(v6.1#6144)

Reply via email to