> -----Original Message----- > From: nishant kumar [mailto:[EMAIL PROTECTED] > Sent: Sunday, February 15, 2004 9:15 AM > To: Struts Developers List > Subject: RE: string concatenation > > > hi, > if you look at the source code of the join method then you will find > that it is doing exactly what struts is currently doing, ie using > StringBuffer for concatenation and finally returning a string.
Then I suggest you propose a patch to join() on the commons-dev list, along with tests and preferably benchmarks to demonstrate that your method is truly faster. > as far as the packaging of the StringHolder class is > concerned, it is > not great a concern. only thing i wished to point out was that all the > html tags need a change in this direction. this will make them much > faster and this is really needed as these tags are quite often used. Do you have actual benchmarks to show that it would make a significant difference, or are you going on basis that this is "obvious"? -- Martin Cooper > > thanks, > nishant. > > On Sun, 2004-02-15 at 07:41, Martin Cooper wrote: > > Rather than add a new string utility class to Struts, which isn't really > > where it should belong, I think we'd be better off just using this: > > > > > http://jakarta.apache.org/commons/lang/api/org/apache/commons/lang > /StringUti > > ls.html#join(java.lang.Object[]) > > > > Alternatively, you could suggest (on the commons-dev list) adding a > > variation of your StringHolder class, based on the join() > method above, to > > Commons Lang. > > > > -- > > Martin Cooper > > > > > > > -----Original Message----- > > > From: nishant kumar [mailto:[EMAIL PROTECTED] > > > Sent: Saturday, February 14, 2004 5:46 PM > > > To: [EMAIL PROTECTED] > > > Subject: string concatenation > > > > > > > > > hi, > > > I have a performance tuning suggestion which i think will greatly > > > impact the performance of struts html tags. > > > String concatenation using StringBuffer is definitely much > > > better than > > > using the plus operator but there are scenarios where there are much > > > better ways than using StringBuffers. Actually struts html > tags fall in > > > those scenarios. > > > So let me give you an example. this is the code from > > > renderFormStartElement method of FormTag. > > > > > > StringBuffer results = new StringBuffer(); > > > results.append("<form"); > > > results.append(" name=\""); > > > results.append(beanName); > > > results.append("\""); > > > results.append(" method=\""); > > > results.append(method == null ? "post" : method); > > > results.append("\" action=\""); > > > .... > > > str = results.toString(); > > > > > > pageContext.getOut().write(str); > > > > > > Now lets list the issues with this. > > > 1. first presizing this buffer is quite difficult (avoided in this > > > case). here the buffer starts with size 16 and doubles each time the > > > size is exceeded. This causes unnecessary creation of new char arrays > > > and redundant copy of data whenever resizing happens. > > > 2. whenever append is called data is copied from the passed string to > > > the end of stringbuffer. > > > 3. finally the whole concatenated data is again copied into another > > > string. > > > 4. and then in the end this string is written to a writer, > another copy, > > > which is the only copy required. > > > > > > so even if you had presized the stringbuffer correctly, you > have copied > > > the same data thrice instead of just once. And you also create two NOT > > > needed objects. > > > > > > so here is the solution i propose. have a class holding an array of > > > Strings and keep appending strings to this array and finally > print this > > > array to the writer. something like this. > > > > > > private String[] data = new String[256]; > > > private int size = 0; > > > > > > public StringHolder append(String str){ > > > ensureCapacity(this.size + 1); > > > this.data[this.size++] = str; > > > return this; > > > } > > > > > > public void writeTo(Writer out) throws IOException{ > > > for (int i = 0; i < this.size; i++){ > > > if (this.data[i] != null){ > > > out.write(this.data[i]); > > > } > > > } > > > } > > > > > > this way only the last copy takes place and you also avoid creating so > > > much garbage. > > > > > > i have attached StringHolder class which does the above task and also > > > the FormTag after making necessary modification to fit in this class. > > > >From the code of FormTag you can see that you need to make quite few > > > changes to get great benefit. > > > > > > i have also attached a better implementation of > > > ResponseUtils.filter(String) method. the logic is on the same lines as > > > above. > > > > > > thanks, > > > nishant > > > > > > -- > > > nishant kumar <[EMAIL PROTECTED]> > > > > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]