Author: kkolinko
Date: Fri Jun 19 12:51:11 2009
New Revision: 786484

URL: http://svn.apache.org/viewvc?rev=786484&view=rev
Log:
Added toString() call to the StringBuffer. The tests will run a bit slower 
because of that.
Added two other implementation variants for the first test.

Modified:
    tomcat/trunk/test/org/apache/catalina/valves/Benchmarks.java

Modified: tomcat/trunk/test/org/apache/catalina/valves/Benchmarks.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/valves/Benchmarks.java?rev=786484&r1=786483&r2=786484&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/valves/Benchmarks.java (original)
+++ tomcat/trunk/test/org/apache/catalina/valves/Benchmarks.java Fri Jun 19 
12:51:11 2009
@@ -33,7 +33,9 @@
         // Is it better to use a sync or a thread local here?
         BenchmarkTest benchmark = new BenchmarkTest();
         Runnable[] tests = new Runnable[] { new GetDateBenchmarkTest_Sync(),
-                new GetDateBenchmarkTest_Local() };
+                new GetDateBenchmarkTest_Local(),
+                new GetDateBenchmarkTest_LocalMutableLong(),
+                new GetDateBenchmarkTest_LocalStruct() };
         benchmark.doTest(5, tests);
     }
 
@@ -92,6 +94,72 @@
         }
     }
 
+    private static class GetDateBenchmarkTest_LocalMutableLong implements
+            Runnable {
+
+        public String toString() {
+            return "ThreadLocals with a mutable Long";
+        }
+
+        private static class MutableLong {
+            long value = 0;
+        }
+
+        private ThreadLocal<MutableLong> currentMillisLocal = new 
ThreadLocal<MutableLong>() {
+            protected MutableLong initialValue() {
+                return new MutableLong();
+            }
+        };
+
+        private ThreadLocal<Date> currentDateLocal = new ThreadLocal<Date>();
+
+        public void run() {
+            getCurrentDate();
+        }
+
+        public Date getCurrentDate() {
+            long systime = System.currentTimeMillis();
+            if ((systime - currentMillisLocal.get().value) > 1000) {
+                currentDateLocal.set(new Date(systime));
+                currentMillisLocal.get().value = systime;
+            }
+            return currentDateLocal.get();
+        }
+    }
+
+    private static class GetDateBenchmarkTest_LocalStruct implements Runnable {
+
+        public String toString() {
+            return "single ThreadLocal";
+        }
+
+        // note, that we can avoid (long -> Long) conversion
+        private static class Struct {
+            long currentMillis = 0;
+            Date currentDate;
+        }
+
+        private ThreadLocal<Struct> currentStruct = new ThreadLocal<Struct>() {
+            protected Struct initialValue() {
+                return new Struct();
+            }
+        };
+
+        public void run() {
+            getCurrentDate();
+        }
+
+        public Date getCurrentDate() {
+            Struct struct = currentStruct.get();
+            long systime = System.currentTimeMillis();
+            if ((systime - struct.currentMillis) > 1000) {
+                struct.currentDate = new Date(systime);
+                struct.currentMillis = systime;
+            }
+            return struct.currentDate;
+        }
+    }
+
     public void testAccessLogTimeDateElement() throws Exception {
         // Is it better to use a sync or a thread local here?
         BenchmarkTest benchmark = new BenchmarkTest();
@@ -136,7 +204,7 @@
             printDate();
         }
 
-        public StringBuffer printDate() {
+        public String printDate() {
             StringBuffer buf = new StringBuffer();
             Date date = getDateSync();
             if (currentDate != date) {
@@ -158,7 +226,7 @@
                 }
             }
             buf.append(currentDateString);
-            return buf;
+            return buf.toString();
         }
 
         private Date getDateSync() {
@@ -216,7 +284,7 @@
             printDate();
         }
 
-        public StringBuffer printDate() {
+        public String printDate() {
             StringBuffer buf = new StringBuffer();
             Date date = getDateLocal();
             if (currentDate != date) {
@@ -234,7 +302,7 @@
                 currentDate = date;
             }
             buf.append(currentDateString);
-            return buf;
+            return buf.toString();
         }
 
         private Date getDateLocal() {



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

Reply via email to