Author: markt
Date: Mon Sep 14 08:54:24 2015
New Revision: 1702873
URL: http://svn.apache.org/r1702873
Log:
Simpler, thread-safe code.
Better throughput over anything more than 1000 requests.
Modified:
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/http/HttpMessages.java
Modified:
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/http/HttpMessages.java
URL:
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/http/HttpMessages.java?rev=1702873&r1=1702872&r2=1702873&view=diff
==============================================================================
--- tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/http/HttpMessages.java
(original)
+++ tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/http/HttpMessages.java Mon
Sep 14 08:54:24 2015
@@ -44,13 +44,28 @@ public class HttpMessages {
private final StringManager sm;
- private String st_200 = null;
- private String st_302 = null;
- private String st_400 = null;
- private String st_404 = null;
+ private final String st_200;
+ private final String st_302;
+ private final String st_400;
+ private final String st_404;
private HttpMessages(StringManager sm) {
+ // There is a performance tradeoff here. This implementation incurs
+ // ~160ns (40ns per StringManager) lookup delay on first access but all
+ // subsequent lookups take ~0.25ns.
+ // The alternative approach (lazy init of each cached String) delays
the
+ // StringManager lookup until required but increases the time for
+ // subsequent lookups to ~0.5ns.
+ // These times will be in the noise for most requests. This
+ // implementation was chosen because:
+ // - Over anything more than a few hundred requests it is faster.
+ // - The code is a lot simpler. Thread safe lazy init needs care to get
+ // right. See http://markmail.org/thread/wjp3oejdyxcrz7do
this.sm = sm;
+ st_200 = sm.getString("sc.200");
+ st_302 = sm.getString("sc.302");
+ st_400 = sm.getString("sc.400");
+ st_404 = sm.getString("sc.404");
}
@@ -64,37 +79,18 @@ public class HttpMessages {
* HTTP specification
*/
public String getMessage(int status) {
- switch( status ) {
- case 200: {
- String s = st_200;
- if(s == null ) {
- st_200 = s = sm.getString("sc.200");
- }
- return s;
+ switch (status) {
+ case 200:
+ return st_200;
+ case 302:
+ return st_302;
+ case 400:
+ return st_400;
+ case 404:
+ return st_404;
+ default:
+ return sm.getString("sc."+ status);
}
- case 302: {
- String s = st_302;
- if(s == null ) {
- st_302 = s = sm.getString("sc.302");
- }
- return s;
- }
- case 400: {
- String s = st_400;
- if(s == null ) {
- st_400 = s = sm.getString("sc.400");
- }
- return s;
- }
- case 404: {
- String s = st_404;
- if(s == null ) {
- st_404 = s = sm.getString("sc.404");
- }
- return s;
- }
- }
- return sm.getString("sc."+ status);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]