[ 
https://issues.apache.org/jira/browse/JCR-2218?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12735039#action_12735039
 ] 

Michael Dürig commented on JCR-2218:
------------------------------------

I just checked the effect of an alternative approach: call site caching of 
IdFactory calls. 

public NodeId getId() throws InvalidItemStateException, RepositoryException {
    IdFactory idFactory = getIdFactory();
    PathFactory pathFactory = getPathFactory();
    IdCache idCache = getIdCache();

    if (uniqueID != null) {
        NodeId nodeId = idCache.get(uniqueID);
        if (nodeId == null) {
            nodeId = idFactory.createNodeId(uniqueID);
            idCache.put(uniqueID, nodeId);
        }
        return nodeId;
    }
    else if (parent == null) { // root
        NodeId nodeId = idCache.get("ROOT");  
        if (nodeId == null) {
            nodeId = idFactory.createNodeId((String) null, 
pathFactory.getRootPath());
            idCache.put("ROOT", nodeId);  
        }
        return nodeId;
    }
    else {
        NodeId parentId = parent.getId();
        Name name = getName();
        int index = getIndex();
        NodeId nodeId = idCache.get(parentId, name, index);
        if (nodeId == null) {
            Path path = pathFactory.create(name, index);
            nodeId = idFactory.createNodeId(parentId, path);
            idCache.put(parentId, name, index, nodeId);
        }
        return nodeId;
    }
}

My profiling shows, that there is nothing much to be gained from this. This is 
in line with an earlier observation, that looking up ItemIds from a hash map 
comes with about the same cost as creating new itemIds. The main contribution 
coming from the equals and hashCode methods from the various classes involved 
when comparing ItemIds. 




> NodeEntryImpl.getWorkspaceId() very inefficient 
> ------------------------------------------------
>
>                 Key: JCR-2218
>                 URL: https://issues.apache.org/jira/browse/JCR-2218
>             Project: Jackrabbit Content Repository
>          Issue Type: Improvement
>          Components: jackrabbit-jcr2spi
>            Reporter: Michael Dürig
>
> NodeEntryImpl.getWorkspaceId() calculates its path on each call by calling 
> itself recursively. Further each call to getWorkspaceId() results in various 
> calls to the path and item factories which might be somewhat expensive by 
> themselves. 
> In my test scenario I have a RepositoryService.getItemInfos() call returning 
> ~1000 items. Processing these items results in about 2700000 (!) calls to 
> getWorkspaceId(). Profiler data shows, that 98% of the time to process the 
> 1000 items is spent in getWorkspaceId()  and related calls. 

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to