StringUtils.join(Object[]) performance issue if .toString() is not trivial
--------------------------------------------------------------------------

                 Key: LANG-770
                 URL: https://issues.apache.org/jira/browse/LANG-770
             Project: Commons Lang
          Issue Type: Bug
            Reporter: Joe Barnett


I have some code that builds syntax trees, and then uses a combination of 
TreeNode.toString() and StringUtils.join() to recursively convert that syntax 
tree to a String representation.

example .toString() of a SumNode class, where children is a TreeNode[]:

public String toString() {
    return StringUtils.join(children, "+");
}

The problem is, StringUtils.join(Object[], String, int, int) is trying to be 
too smart about preallocating the StringBuffer size it uses internally, as it 
does:

bufSize *= ((array[startIndex] == null ? 16 : 
array[startIndex].toString().length())
                        + separator.length());

followed by implicitly calling .toString() on each object in the array:

buf.append(array[i]);

For deep syntax trees, this results in incredibly bad performance, as when 
traversing the syntax tree, every time we go to the first node, we re-expand 
the entire tree below that node (which does the same thing with the first node 
below that, etc).

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to