I'm attaching the benchmark, the code generated by TC, and the code generated by Resin. Resin String handling tricks ends with it making about half the amount of writes, and writing char arrays instead of Strings. I believe this is faster :-D
While the benchmark is quite lame, I believe a lot of pages have similar amounts of interleaved static HTML, so optimizing this would give a healthy performance increase. (Note: I did a quick review with a profiler, and all the CPU time is spent in the _jspService method body, using a compiled JSP, so the performance overhead is in the generated code for this particular test)
(I found this while looking for optimization ideas)
Can we get the same kind of stuff ? Kin-Man, Jan, others ?
Remy
<%@ page session='false' import='java.util.*'%> <html><head><title><%= request.getParameter("title") %></title></head><body> <% // build tight loop table with array data, multidimensional 5x6 String array[] = { "Hello", "World", "2000", "Hello", "World", "2000" }; Arrays.sort(array); String multi[][] = { array, array, array, array, array }; %> <table> <% for(int row=0; row < multi.length; row++) { %> <tr bgcolor="<%= (row % 2) == 1 ? "gray" : "white" %>"> <% for(int col=0; col < array.length; col++) { %> <td align="center"><font size="+1"><%= multi[row][col] %></font></td> <% } %> </tr> <% } %> </table> <% String dummy = request.getParameter("integer"); int param = 2000; //Integer.parseInt(dummy); for (int i=1; i<=10; i++) { int var = i+param; %> <%=var%> Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World <br/> <%=var%> Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World <br/> <%=var%> Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World <br/> <%=var%> Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World <br/> <%=var%> Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World <br/> <%=var%> Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World <br/> <%=var%> Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World <br/> <%=var%> Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World <br/> <%=var%> Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World <br/> <%=var%> Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World <br/> <%=var%> Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World <br/> <%=var%> Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World <br/> <%=var%> Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World <br/> <%=var%> Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World <br/> <%=var%> Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World <br/> <%=var%> Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World <br/> <%=var%> Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World <br/> <%=var%> Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World <br/> <%=var%> Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World <br/> <%=var%> Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World <br/> <% } %> </body></html>
package org.apache.jsp;
import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; import java.util.*; public final class h2000_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent { private static java.util.Vector _jspx_dependants; public java.util.List getDependants() { return _jspx_dependants; } public void _jspService(HttpServletRequest request, HttpServletResponse response) throws java.io.IOException, ServletException { JspFactory _jspxFactory = null; PageContext pageContext = null; ServletContext application = null; ServletConfig config = null; JspWriter out = null; Object page = this; JspWriter _jspx_out = null; try { _jspxFactory = JspFactory.getDefaultFactory(); response.setContentType("text/html"); pageContext = _jspxFactory.getPageContext(this, request, response, null, false, 8192, true); application = pageContext.getServletContext(); config = pageContext.getServletConfig(); out = pageContext.getOut(); _jspx_out = out; out.write("\n"); out.write("<html>"); out.write("<head>"); out.write("<title>"); out.write(String.valueOf( request.getParameter("title") )); out.write("</title>"); out.write("</head>"); out.write("<body>\n"); // build tight loop table with array data, multidimensional 5x6 String array[] = { "Hello", "World", "2000", "Hello", "World", "2000" }; Arrays.sort(array); String multi[][] = { array, array, array, array, array }; out.write("\n"); out.write("<table>\n "); for(int row=0; row < multi.length; row++) { out.write("\n "); out.write("<tr bgcolor=\""); out.write(String.valueOf( (row % 2) == 1 ? "gray" : "white" )); out.write("\">\n "); for(int col=0; col < array.length; col++) { out.write("\n "); out.write("<td align=\"center\">"); out.write("<font size=\"+1\">"); out.write(String.valueOf( multi[row][col] )); out.write("</font>"); out.write("</td>\n "); } out.write("\n "); out.write("</tr>\n "); } out.write("\n"); out.write("</table>\n"); String dummy = request.getParameter("integer"); int param = 2000; //Integer.parseInt(dummy); for (int i=1; i<=10; i++) { int var = i+param; out.write("\n "); out.write(String.valueOf(var)); out.write(" Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World "); out.write("<br/>\n "); out.write(String.valueOf(var)); out.write(" Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World "); out.write("<br/>\n "); out.write(String.valueOf(var)); out.write(" Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World "); out.write("<br/>\n "); out.write(String.valueOf(var)); out.write(" Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World "); out.write("<br/>\n "); out.write(String.valueOf(var)); out.write(" Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World "); out.write("<br/>\n "); out.write(String.valueOf(var)); out.write(" Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World "); out.write("<br/>\n "); out.write(String.valueOf(var)); out.write(" Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World "); out.write("<br/>\n "); out.write(String.valueOf(var)); out.write(" Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World "); out.write("<br/>\n "); out.write(String.valueOf(var)); out.write(" Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World "); out.write("<br/>\n "); out.write(String.valueOf(var)); out.write(" Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World "); out.write("<br/>\n "); out.write(String.valueOf(var)); out.write(" Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World "); out.write("<br/>\n "); out.write(String.valueOf(var)); out.write(" Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World "); out.write("<br/>\n "); out.write(String.valueOf(var)); out.write(" Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World "); out.write("<br/>\n "); out.write(String.valueOf(var)); out.write(" Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World "); out.write("<br/>\n "); out.write(String.valueOf(var)); out.write(" Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World "); out.write("<br/>\n "); out.write(String.valueOf(var)); out.write(" Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World "); out.write("<br/>\n "); out.write(String.valueOf(var)); out.write(" Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World "); out.write("<br/>\n "); out.write(String.valueOf(var)); out.write(" Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World "); out.write("<br/>\n "); out.write(String.valueOf(var)); out.write(" Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World "); out.write("<br/>\n "); out.write(String.valueOf(var)); out.write(" Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World "); out.write("<br/>\n "); } out.write("\n"); out.write("</body>"); out.write("</html>\n"); } catch (Throwable t) { if (!(t instanceof SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) out.clearBuffer(); if (pageContext != null) pageContext.handlePageException(t); } } finally { if (_jspxFactory != null) _jspxFactory.releasePageContext(pageContext); } } }
/* * JSP generated by Resin 3.0.2-beta (built Mon Aug 4 13:55:26 PDT 2003) */ import javax.servlet.*; import javax.servlet.jsp.*; import javax.servlet.http.*; import java.util.*; public class _h2000__jsp extends com.caucho.jsp.JavaPage{ private boolean _caucho_isDead; public void _jspService(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { com.caucho.jsp.PageContextImpl pageContext = com.caucho.jsp.QJspFactory.allocatePageContext(this, request, response, null, false, 8192, true); javax.servlet.jsp.JspWriter out = (javax.servlet.jsp.JspWriter) pageContext.getOut(); javax.servlet.ServletConfig config = getServletConfig(); javax.servlet.Servlet page = this; javax.servlet.ServletContext application = pageContext.getServletContext(); response.setContentType("text/html"); try { out.write(_jsp_string0, 0, _jsp_string0.length); out.print(( request.getParameter("title") )); out.write(_jsp_string1, 0, _jsp_string1.length); // build tight loop table with array data, multidimensional 5x6 String array[] = { "Hello", "World", "2000", "Hello", "World", "2000" }; Arrays.sort(array); String multi[][] = { array, array, array, array, array }; out.write(_jsp_string2, 0, _jsp_string2.length); for(int row=0; row < multi.length; row++) { out.write(_jsp_string3, 0, _jsp_string3.length); out.print(( (row % 2) == 1 ? "gray" : "white" )); out.write(_jsp_string4, 0, _jsp_string4.length); for(int col=0; col < array.length; col++) { out.write(_jsp_string5, 0, _jsp_string5.length); out.print(( multi[row][col] )); out.write(_jsp_string6, 0, _jsp_string6.length); } out.write(_jsp_string7, 0, _jsp_string7.length); } out.write(_jsp_string8, 0, _jsp_string8.length); String dummy = request.getParameter("integer"); int param = 2000; //Integer.parseInt(dummy); for (int i=1; i<=10; i++) { int var = i+param; out.write(_jsp_string9, 0, _jsp_string9.length); out.print((var)); out.write(_jsp_string10, 0, _jsp_string10.length); out.print((var)); out.write(_jsp_string10, 0, _jsp_string10.length); out.print((var)); out.write(_jsp_string10, 0, _jsp_string10.length); out.print((var)); out.write(_jsp_string10, 0, _jsp_string10.length); out.print((var)); out.write(_jsp_string10, 0, _jsp_string10.length); out.print((var)); out.write(_jsp_string10, 0, _jsp_string10.length); out.print((var)); out.write(_jsp_string10, 0, _jsp_string10.length); out.print((var)); out.write(_jsp_string10, 0, _jsp_string10.length); out.print((var)); out.write(_jsp_string10, 0, _jsp_string10.length); out.print((var)); out.write(_jsp_string10, 0, _jsp_string10.length); out.print((var)); out.write(_jsp_string10, 0, _jsp_string10.length); out.print((var)); out.write(_jsp_string10, 0, _jsp_string10.length); out.print((var)); out.write(_jsp_string10, 0, _jsp_string10.length); out.print((var)); out.write(_jsp_string10, 0, _jsp_string10.length); out.print((var)); out.write(_jsp_string10, 0, _jsp_string10.length); out.print((var)); out.write(_jsp_string10, 0, _jsp_string10.length); out.print((var)); out.write(_jsp_string10, 0, _jsp_string10.length); out.print((var)); out.write(_jsp_string10, 0, _jsp_string10.length); out.print((var)); out.write(_jsp_string10, 0, _jsp_string10.length); out.print((var)); out.write(_jsp_string10, 0, _jsp_string10.length); } out.write(_jsp_string11, 0, _jsp_string11.length); } catch (java.lang.Throwable _jsp_e) { pageContext.handlePageException(_jsp_e); } finally { com.caucho.jsp.QJspFactory.freePageContext(pageContext); } } private com.caucho.java.LineMap _caucho_line_map; private java.util.ArrayList _caucho_depends = new java.util.ArrayList(); public boolean _caucho_isModified() { if (_caucho_isDead) return true; if (com.caucho.util.CauchoSystem.getVersionId() != 99847609) return true; for (int i = _caucho_depends.size() - 1; i >= 0; i--) { com.caucho.make.Dependency depend; depend = (com.caucho.make.Dependency) _caucho_depends.get(i); if (depend.isModified()) return true; } return false; } public long _caucho_lastModified() { return 0; } public com.caucho.java.LineMap _caucho_getLineMap() { return _caucho_line_map; } public void destroy() { _caucho_isDead = true; super.destroy(); } public void init(com.caucho.java.LineMap lineMap, com.caucho.vfs.Path appDir) throws javax.servlet.ServletException { com.caucho.vfs.Path resinHome = com.caucho.util.CauchoSystem.getResinHome(); com.caucho.vfs.MergePath mergePath = new com.caucho.vfs.MergePath(); mergePath.addMergePath(appDir); mergePath.addMergePath(resinHome); com.caucho.loader.DynamicClassLoader loader; loader = (com.caucho.loader.DynamicClassLoader) getClass().getClassLoader(); String resourcePath = loader.getResourcePathSpecificFirst(); mergePath.addClassPath(resourcePath); _caucho_line_map = new com.caucho.java.LineMap("_h2000__jsp.java", "foo"); _caucho_line_map.add("/h2000.jsp", 1, 25); _caucho_line_map.add(2, 26); _caucho_line_map.add(2, 27); _caucho_line_map.add(10, 35); _caucho_line_map.add(11, 37); _caucho_line_map.add(11, 38); _caucho_line_map.add(12, 39); _caucho_line_map.add(13, 41); _caucho_line_map.add(13, 42); _caucho_line_map.add(23, 52); _caucho_line_map.add(24, 54); _caucho_line_map.add(24, 55); _caucho_line_map.add(25, 56); _caucho_line_map.add(25, 57); _caucho_line_map.add(26, 58); _caucho_line_map.add(26, 59); _caucho_line_map.add(27, 60); _caucho_line_map.add(27, 61); _caucho_line_map.add(28, 62); _caucho_line_map.add(28, 63); _caucho_line_map.add(29, 64); _caucho_line_map.add(29, 65); _caucho_line_map.add(30, 66); _caucho_line_map.add(30, 67); _caucho_line_map.add(31, 68); _caucho_line_map.add(31, 69); _caucho_line_map.add(32, 70); _caucho_line_map.add(32, 71); _caucho_line_map.add(33, 72); _caucho_line_map.add(33, 73); _caucho_line_map.add(34, 74); _caucho_line_map.add(34, 75); _caucho_line_map.add(35, 76); _caucho_line_map.add(35, 77); _caucho_line_map.add(36, 78); _caucho_line_map.add(36, 79); _caucho_line_map.add(37, 80); _caucho_line_map.add(37, 81); _caucho_line_map.add(38, 82); _caucho_line_map.add(38, 83); _caucho_line_map.add(39, 84); _caucho_line_map.add(39, 85); _caucho_line_map.add(40, 86); _caucho_line_map.add(40, 87); _caucho_line_map.add(41, 88); _caucho_line_map.add(41, 89); _caucho_line_map.add(42, 90); _caucho_line_map.add(42, 91); _caucho_line_map.add(43, 92); _caucho_line_map.add(43, 93); _caucho_line_map.add(46, 96); com.caucho.vfs.Depend depend; depend = new com.caucho.vfs.Depend(mergePath.lookup("/l:/usr/share/java/resin-3.0.2-beta/doc/h2000.jsp"), "DHlSbg5zeT4OTK3lGV1aD/==", false); _caucho_depends.add(depend); } private final static char []_jsp_string3; private final static char []_jsp_string10; private final static char []_jsp_string11; private final static char []_jsp_string9; private final static char []_jsp_string7; private final static char []_jsp_string5; private final static char []_jsp_string4; private final static char []_jsp_string6; private final static char []_jsp_string1; private final static char []_jsp_string2; private final static char []_jsp_string8; private final static char []_jsp_string0; static { _jsp_string3 = "\n <tr bgcolor=\"".toCharArray(); _jsp_string10 = " Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World <br/>\n ".toCharArray(); _jsp_string11 = "\n</body></html>\n".toCharArray(); _jsp_string9 = "\n ".toCharArray(); _jsp_string7 = "\n </tr>\n ".toCharArray(); _jsp_string5 = "\n <td align=\"center\"><font size=\"+1\">".toCharArray(); _jsp_string4 = "\">\n ".toCharArray(); _jsp_string6 = "</font></td>\n ".toCharArray(); _jsp_string1 = "</title></head><body>\n".toCharArray(); _jsp_string2 = "\n<table>\n ".toCharArray(); _jsp_string8 = "\n</table>\n".toCharArray(); _jsp_string0 = "\n<html><head><title>".toCharArray(); } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]