Author: kkolinko
Date: Fri Jun 19 18:57:59 2009
New Revision: 786631

URL: http://svn.apache.org/viewvc?rev=786631&view=rev
Log:
Add two more implementations for the second test.
a) using a single ThreadLocal instead of multiple ones
b) also using StringBuilder instead of StringBuffer
Also, replaced class.getName() with class.getSimpleName() in the status message.

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=786631&r1=786630&r2=786631&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/valves/Benchmarks.java (original)
+++ tomcat/trunk/test/org/apache/catalina/valves/Benchmarks.java Fri Jun 19 
18:57:59 2009
@@ -135,8 +135,8 @@
 
         // note, that we can avoid (long -> Long) conversion
         private static class Struct {
-            long currentMillis = 0;
-            Date currentDate;
+            public long currentMillis = 0;
+            public Date currentDate;
         }
 
         private ThreadLocal<Struct> currentStruct = new ThreadLocal<Struct>() {
@@ -165,7 +165,9 @@
         BenchmarkTest benchmark = new BenchmarkTest();
         Runnable[] tests = new Runnable[] {
                 new TimeDateElementBenchmarkTest_Sync(),
-                new TimeDateElementBenchmarkTest_Local() };
+                new TimeDateElementBenchmarkTest_Local(),
+                new TimeDateElementBenchmarkTest_LocalStruct(),
+                new TimeDateElementBenchmarkTest_LocalStruct_SBuilder() };
         benchmark.doTest(5, tests);
     }
 
@@ -285,13 +287,17 @@
             if (currentDateStringLocal.get() == null) {
                 StringBuffer current = new StringBuffer(32);
                 current.append('[');
-                
current.append(dayFormatterLocal.get().format(currentDateLocal.get())); // Day
+                current.append(dayFormatterLocal.get().format(
+                        currentDateLocal.get())); // Day
                 current.append('/');
-                
current.append(lookup(monthFormatterLocal.get().format(currentDateLocal.get())));
 // Month
+                current.append(lookup(monthFormatterLocal.get().format(
+                        currentDateLocal.get()))); // Month
                 current.append('/');
-                
current.append(yearFormatterLocal.get().format(currentDateLocal.get())); // Year
+                current.append(yearFormatterLocal.get().format(
+                        currentDateLocal.get())); // Year
                 current.append(':');
-                
current.append(timeFormatterLocal.get().format(currentDateLocal.get())); // Time
+                current.append(timeFormatterLocal.get().format(
+                        currentDateLocal.get())); // Time
                 current.append(']');
                 currentDateStringLocal.set(current.toString());
             }
@@ -308,6 +314,122 @@
         }
     }
 
+    private static class TimeDateElementBenchmarkTest_LocalStruct extends
+            TimeDateElementBenchmarkTestBase implements Runnable {
+
+        public String toString() {
+            return "single ThreadLocal";
+        }
+
+        private static class Struct {
+            public String currentDateString;
+            public Date currentDate = new Date();
+            public SimpleDateFormat dayFormatter = new SimpleDateFormat("dd");
+            public SimpleDateFormat monthFormatter = new 
SimpleDateFormat("MM");
+            public SimpleDateFormat yearFormatter = new 
SimpleDateFormat("yyyy");
+            public SimpleDateFormat timeFormatter = new SimpleDateFormat(
+                    "hh:mm:ss");
+        }
+
+        private ThreadLocal<Struct> structLocal = new ThreadLocal<Struct>() {
+            protected Struct initialValue() {
+                return new Struct();
+            }
+        };
+
+        public void run() {
+            printDate();
+        }
+
+        public String printDate() {
+            getDateLocal();
+            Struct struct = structLocal.get();
+            if (struct.currentDateString == null) {
+                StringBuffer current = new StringBuffer(32);
+                current.append('[');
+                
current.append(struct.dayFormatter.format(struct.currentDate)); // Day
+                current.append('/');
+                current.append(lookup(struct.monthFormatter
+                        .format(struct.currentDate))); // Month
+                current.append('/');
+                
current.append(struct.yearFormatter.format(struct.currentDate)); // Year
+                current.append(':');
+                
current.append(struct.timeFormatter.format(struct.currentDate)); // Time
+                current.append(']');
+                struct.currentDateString = current.toString();
+            }
+            return struct.currentDateString;
+        }
+
+        private Date getDateLocal() {
+            Struct struct = structLocal.get();
+            long systime = System.currentTimeMillis();
+            if ((systime - struct.currentDate.getTime()) > 1000) {
+                struct.currentDate.setTime(systime);
+                struct.currentDateString = null;
+            }
+            return struct.currentDate;
+        }
+    }
+
+    private static class TimeDateElementBenchmarkTest_LocalStruct_SBuilder 
extends
+            TimeDateElementBenchmarkTestBase implements Runnable {
+
+        public String toString() {
+            return "single ThreadLocal, with StringBuilder";
+        }
+
+        private static class Struct {
+            public String currentDateString;
+            public Date currentDate = new Date();
+            public SimpleDateFormat dayFormatter = new SimpleDateFormat("dd");
+            public SimpleDateFormat monthFormatter = new 
SimpleDateFormat("MM");
+            public SimpleDateFormat yearFormatter = new 
SimpleDateFormat("yyyy");
+            public SimpleDateFormat timeFormatter = new SimpleDateFormat(
+                    "hh:mm:ss");
+        }
+
+        private ThreadLocal<Struct> structLocal = new ThreadLocal<Struct>() {
+            protected Struct initialValue() {
+                return new Struct();
+            }
+        };
+
+        public void run() {
+            printDate();
+        }
+
+        public String printDate() {
+            getDateLocal();
+            Struct struct = structLocal.get();
+            if (struct.currentDateString == null) {
+                StringBuilder current = new StringBuilder(32);
+                current.append('[');
+                
current.append(struct.dayFormatter.format(struct.currentDate)); // Day
+                current.append('/');
+                current.append(lookup(struct.monthFormatter
+                        .format(struct.currentDate))); // Month
+                current.append('/');
+                
current.append(struct.yearFormatter.format(struct.currentDate)); // Year
+                current.append(':');
+                
current.append(struct.timeFormatter.format(struct.currentDate)); // Time
+                current.append(']');
+                struct.currentDateString = current.toString();
+            }
+            return struct.currentDateString;
+        }
+
+        private Date getDateLocal() {
+            Struct struct = structLocal.get();
+            long systime = System.currentTimeMillis();
+            if ((systime - struct.currentDate.getTime()) > 1000) {
+                struct.currentDate.setTime(systime);
+                struct.currentDateString = null;
+            }
+            return struct.currentDate;
+        }
+    }
+
     private static class BenchmarkTest {
         public void doTest(int threadCount, Runnable[] tests) throws Exception 
{
             for (int iterations = 1000000; iterations < 10000001; iterations 
+= 1000000) {
@@ -332,9 +454,10 @@
             }
             long end = System.currentTimeMillis();
 
-            System.out.println(test.getClass().getName() + ": " + threadCount
-                    + " threads and " + iterations + " iterations using "
-                    + test + " took " + (end - start) + "ms");
+            System.out.println(test.getClass().getSimpleName() + ": "
+                    + threadCount + " threads and " + iterations
+                    + " iterations using " + test + " took " + (end - start)
+                    + "ms");
         }
     }
 



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

Reply via email to