On Thu, Dec 31, 2009 at 11:12 PM, Blake Sullivan <blake.sulli...@oracle.com> wrote: > UIComponent.getId() is by far the most requested component attribute. There > are a number of reasons for this: > 1) The JSF RI has an issue in the JSP-JSF integration which causes getId() > to be called n^2 times where n is the number of children a component has
I guess this is true for MyFaces as well, right? > 2) getClientId() calls getId() > 3) FindComponent calls getId() > 4) The tree visiting code trades off calls to getClientId() for calls to > getId() > > FacesBean optimizes attribute Map access at the expense of access directly > through the component. The the extent that Renderers are Components are > accessing the attributes through the attribute Map, this is fine, however > even the Renderers access attributes common to all UIComponents such as id() > through the component directly. Considering the huge number of times that > the the id is accessed (for some renders, this was 8% of the rendering > time), it makes sense to optimize this path. > > The proposal is to: > 1) Store the id an an instance variable on the UIXComponent > 2) Add a new capability flag to PropertyKey indicating that the property is > actually stored elsewhere using a ValueExpression will be stored as the > property's value in the PropertyMap. For access through the FacesBean, the > ValueExpression will be evaluated to get/set the actual value > 3) For state saving the ValueExpression is used to retrieve the actual value > and for state restoration the ValueExpression (which has been rebootstrapped > by the UIXComponent) is used to write the value back > 4) Instead of setting the id attribute in the FacesBean, UIXComponent stores > it locally and sets an ValueExpression implementation into the FacesBean > that retrieves the value from the UIXComponent +1 on api/patch > > API Changes: > > PropertyKey: > > add > > /** > * Capability indicating that values for this property should be > * be stored and retrieved through a ValueExpression rather than on the > * FacesBean itself > */ > static public final int CAP_VALUE_EXPRESSION_IMPLEMENTATION = 16; > > /** > * Returns <code>true</code> if property values for this key are set and get > * using a ValueExpression rather than storing the value in the FacesBean. > * @return <code>true</code> if properties values for this key are retrieved > * with a ValueExpression. > */ > public boolean usesValueExpressionAsImplementation() > > After this change id retrieval doesn't make the 1% YourKit profiler hot spot > cut off > > > -- Matthias Wessendorf blog: http://matthiaswessendorf.wordpress.com/ sessions: http://www.slideshare.net/mwessendorf twitter: http://twitter.com/mwessendorf