2012/9/23  <ma...@apache.org>:
> Author: markt
> Date: Sun Sep 23 10:36:58 2012
> New Revision: 1389005
>
> URL: http://svn.apache.org/viewvc?rev=1389005&view=rev
> Log:
> More GC reduction in the AccessLog. Integer.toString(response.getStatus()) 
> was responsible for ~4% of allocated objects under load
>
> Modified:
>     tomcat/trunk/java/org/apache/catalina/valves/AccessLogValve.java
>     tomcat/trunk/java/org/apache/catalina/valves/Constants.java
>
> Modified: tomcat/trunk/java/org/apache/catalina/valves/AccessLogValve.java
> URL: 
> http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/valves/AccessLogValve.java?rev=1389005&r1=1389004&r2=1389005&view=diff
> ==============================================================================
> --- tomcat/trunk/java/org/apache/catalina/valves/AccessLogValve.java 
> (original)
> +++ tomcat/trunk/java/org/apache/catalina/valves/AccessLogValve.java Sun Sep 
> 23 10:36:58 2012
> @@ -41,6 +41,7 @@ import java.util.concurrent.ConcurrentLi
>
>  import javax.servlet.ServletException;
>  import javax.servlet.http.Cookie;
> +import javax.servlet.http.HttpServletResponse;
>  import javax.servlet.http.HttpSession;
>
>  import org.apache.catalina.AccessLog;
> @@ -1617,7 +1618,134 @@ public class AccessLogValve extends Valv
>          public void addElement(CharBuffer buf, Date date, Request request,
>                  Response response, long time) {
>              if (response != null) {
> -                buf.append(Integer.toString(response.getStatus()));
> +                // This approach is used to reduce GC
> +                switch (response.getStatus()) {
> +                    case HttpServletResponse.SC_CONTINUE:
> +                        buf.put(Constants.SC_CONTINUE_CHAR);
> +                        break;
> +                    case HttpServletResponse.SC_SWITCHING_PROTOCOLS:
> +                        buf.put(Constants.SC_SWITCHING_PROTOCOLS_CHAR);
> +                        break;
>(...)
> +                }
>              } else {
>                  buf.append('-');
>              }
>
> Modified: tomcat/trunk/java/org/apache/catalina/valves/Constants.java
> URL: 
> http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/valves/Constants.java?rev=1389005&r1=1389004&r2=1389005&view=diff
> ==============================================================================
> --- tomcat/trunk/java/org/apache/catalina/valves/Constants.java (original)
> +++ tomcat/trunk/java/org/apache/catalina/valves/Constants.java Sun Sep 23 
> 10:36:58 2012
> @@ -36,4 +36,44 @@ public final class Constants {
>          public static final String COMBINED_PATTERN = "%h %l %u %t \"%r\" %s 
> %b \"%{Referer}i\" \"%{User-Agent}i\"";
>      }
>
> +    public static final char[] SC_CONTINUE_CHAR = new char[] {'1', '0', '0'};
> +    public static final char[] SC_SWITCHING_PROTOCOLS_CHAR = new char[] 
> {'1', '0', '1'};
>(...)
>  }
>


It is ugly and unmanageable.

BTW, if someone changes the content of those char arrays, the access
log may become a mess.

I propose to just write the digits. I think the following will work,
appending a digit value to the code of '0' character:

int status = response.getStatus();
if (100 <= status && status < 1000) {
   buf.write((char) ('0' + (status/100)));
   buf.write((char) ('0' + ((status / 10) % 10)));
   buf.write((char) ('0' + (status % 10)));
} else {
   buf.write(Integer.toString(status));
}

Best regards,
Konstantin Kolinko

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to