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

Leonardo Uribe resolved MYFACES-3236.
-------------------------------------

       Resolution: Fixed
    Fix Version/s: 2.1.2
                   2.0.8

> UIData performance improvements
> -------------------------------
>
>                 Key: MYFACES-3236
>                 URL: https://issues.apache.org/jira/browse/MYFACES-3236
>             Project: MyFaces Core
>          Issue Type: Improvement
>          Components: JSR-314
>    Affects Versions: 2.0.7, 2.1.1
>            Reporter: Leonardo Uribe
>            Assignee: Leonardo Uribe
>             Fix For: 2.0.8, 2.1.2
>
>
> Some days ago there was a discussion on dev list titled:
> [core] performance: performance hints
> With the following intention (proposed by Martin Koci):
>     MK>> is it possible to introduce performance hints in myfaces-core? Hints
>     MK>> similar to javax.faces.component.visit.VisitHint but related to
>     MK>> performance improvements. Example:
>     
>     MK>> For dataTable like:
>     MK>> <a:dataTable
>     MK>> <a:column>
>     MK>>     #{aExpression}
>     
>     MK>> it's completely unnecessary to save per-row state. Currently there 
> is no
>     MK>> elegant way how to do read-only table (state per-row is always
>     MK>> maintained). If user wants (fast) readOnly table, he/she must extend
>     MK>> UIData and re-implemenent setRowIndex method. But hint say
>     MK>> "org.apache.myfaces.core.UIData.saveRowState"=false can solve it
>     MK>> elegantly - if present (in component.getAttributes()) UIData skips
>     MK>> row-state-saving and restoring methods entirely.
>     
>     MK>> Lifespan of those hints can be request (faceContext.attributes) or 
> view
>     MK>> (component.attributes)
>     
> The discussion there was to create or not a hint but a review of the default 
> algorithm was never done. In theory, UIData.setRowIndex do the following 
> tasks:
> 1. If the component is in row -1 (no row), take a "snapshot" of the 
> components that implements EditableValueHolder, to restore them later when 
> rows are traversed.
> 2. If the component is in a row, save the current state of 
> EditableValueHolder components.
> 3. Move to the selected row.
> 4. If no state saved found, restore EditableValueHolder components from saved 
> initial state.
> 5. If state saved found, restore EditableValueHolder components from stored 
> saved state.  
> After an in-deep analysis, the conclusion was it is not really necessary to 
> create the hint. Instead, we can create a better algorithm that take 
> advantage of 
> the fact that add a non transient EditableValueHolder component inside a 
> dataTable row on render response time leads to a illegal state.
> Since UIData.setRowIndex is a code that is called multiple times, specially 
> for large datatable sets. Doing some performance tests, it was notice the 
> current 
> algorithm uses a lot of memory resources. The proposal is do the following:
> 1. Iterate using index instead iterator for children. This can duplicate the 
> lines of code 
> 2. Do not create Object[]{null,null} instances, use a private static final 
> variable.
> 3. Cache DataListener[].
> 4. If no EditableValueHolder instances found, skip state saving code, but 
> reset all ids.
> 5. Prevent unnecessary calls to getContainerClientId().
> 6. Provide initial size for created ArrayList instances to reduce memory 
> usage.
> 7. Iterate over row state using index, instead iterator, and take advantage 
> instances are ArrayList.
> 8. Do not instantiate ArrayList, unless it is necessary.
>  
> Tests done shows a really big improvement, specially when non 
> EditableValueHolder component instances are inside the datatable, which is a 
> very common use case.
> Based on this patch we can do other things like:
> 1. Port this code to UIRepeat.
> 2. Port this code to Tomahawk.
> 3. Reuse already created state instances, which can improve performance on 
> postback requests.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to