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: [email protected]
For additional commands, e-mail: [email protected]