/**
* Logback: the reliable, generic, fast and flexible logging framework.
* Copyright (C) 1999-2015, QOS.ch. All rights reserved.
*
* This program and the accompanying materials are dual-licensed under
* either the terms of the Eclipse Public License v1.0 as published by
* the Eclipse Foundation
*
* or (per the licensee's choosing)
*
* under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation.
*/
package ch.qos.logback.classic.issue.lbclassic36;
import junit.framework.TestCase;
import junit.framework.Test;
import junit.framework.TestSuite;
import java.text.SimpleDateFormat;
import java.util.Date;
//import org.joda.time.format.DateTimeFormatter;
//import org.joda.time.format.DateTimeFormat;
//import org.joda.time.DateTime;
public class DateFormatOriginal_tzest extends TestCase {
public static final String ISO8601_PATTERN = "yyyy-MM-dd HH:mm:ss,SSS";
static final long NANOS_IN_ONE_SEC = 1000 * 1000 * 1000L;
/**
* Create the test case
*
* @param testName
* name of the test case
*/
public DateFormatOriginal_tzest(String testName) {
super(testName);
}
/**
* @return the suite of tests being tested
*/
public static Test suite() {
return new TestSuite(DateFormatOriginal_tzest.class);
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
public void setUp() throws Exception {
super.setUp();
}
public void tearDown() throws Exception {
super.tearDown();
}
// public void testRaw() throws Exception {
// SimpleDateFormat simpleFormat = new SimpleDateFormat(ISO8601_PATTERN);
// DateTimeFormatter jodaFormat = DateTimeFormat.forPattern(ISO8601_PATTERN);
//
// Date date = new Date();
// DateTime dateTime = new DateTime(date);
//
// long start = System.nanoTime();
// for (int i = 0; i < 100000; ++i) {
// jodaFormat.print(dateTime);
// }
// long jodaAvg = (System.nanoTime() - start) / 100000;
//
//
// start = System.nanoTime();
// for (int i = 0; i < 100000; ++i) {
// simpleFormat.format(date);
// }
// long simpleAvg = (System.nanoTime() - start) / 100000;
//
// float diff = (((float) (simpleAvg - jodaAvg)) / simpleAvg) * 100;
// System.out.println("Raw - JDK: " + simpleAvg + " ns Joda: " + jodaAvg
// + " ns - Difference: " + diff + "%");
// }
public void testSynchronized() throws Exception {
SynchronizedDateFormatter formatter = new SynchronizedDateFormatter();
int threads = 10;
int iterations = 10000;
Thread[] formatThreads = new Thread[threads];
Date date = new Date();
for (int i = 0; i < threads; i++) {
formatThreads[i] = new DateFormatThread(formatter, date, iterations);
}
long start = System.nanoTime();
for (Thread thread : formatThreads) {
thread.start();
}
for (Thread thread : formatThreads) {
thread.join();
}
long end = System.nanoTime();
double actual = ((double) (end - start)) / NANOS_IN_ONE_SEC;
System.out.printf("Synchronized DateFormat: %,.4f seconds\n", actual);
}
public void testUnSynchronized() throws Exception {
UnsynchronizedDateFormatter formatter = new UnsynchronizedDateFormatter();
int threads = 10;
int iterations = 10000;
Thread[] formatThreads = new Thread[threads];
Date date = new Date();
for (int i = 0; i < threads; i++) {
formatThreads[i] = new DateFormatThread(formatter, date, iterations);
}
long start = System.nanoTime();
for (Thread thread : formatThreads) {
thread.start();
}
for (Thread thread : formatThreads) {
thread.join();
}
long end = System.nanoTime();
double actual = ((double) (end - start)) / NANOS_IN_ONE_SEC;
System.out.printf("Unsynchronized DateFormat: %,.4f seconds\n", actual);
}
public void testThreadLocal() throws Exception {
ThreadLocalDateFormatter formatter = new ThreadLocalDateFormatter();
int threads = 10;
int iterations = 10000;
Thread[] formatThreads = new Thread[threads];
Date date = new Date();
for (int i = 0; i < threads; i++) {
formatThreads[i] = new DateFormatThread(formatter, date, iterations);
}
long start = System.nanoTime();
for (Thread thread : formatThreads) {
thread.start();
}
for (Thread thread : formatThreads) {
thread.join();
}
long end = System.nanoTime();
double actual = ((double) (end - start)) / NANOS_IN_ONE_SEC;
System.out.printf("ThreadLocal DateFormat: %,.4f seconds\n", actual);
}
// public void testDateTimeFormatter() throws Exception {
// int threads = 10;
// int iterations = 10000;
// Thread[] formatThreads = new DateTimeFormatThread[threads];
// JodaFormatter formatter = new JodaFormatter();
// Date date = new Date();
// DateTime dateTime = new DateTime(date);
//
// for (int i = 0; i < threads; i++) {
// formatThreads[i] = new DateTimeFormatThread(formatter, dateTime,
// iterations);
// }
// long start = System.nanoTime();
// for (Thread thread : formatThreads) {
// thread.start();
// }
// for (Thread thread : formatThreads) {
// thread.join();
// }
// long end = System.nanoTime();
// double actual = ((double) (end - start)) / NANOS_IN_ONE_SEC;
// System.out.printf("Joda DateTimeFormatter: %,.4f seconds\n", actual);
//
// }
public interface Formatter {
String format(Date date);
}
public static class SynchronizedDateFormatter implements Formatter {
SimpleDateFormat simpleFormat = new SimpleDateFormat(ISO8601_PATTERN);
public synchronized String format(Date date) {
return simpleFormat.format(date);
}
}
public static class UnsynchronizedDateFormatter implements Formatter {
public synchronized String format(Date date) {
return new SimpleDateFormat(ISO8601_PATTERN).format(date);
}
}
public static class ThreadLocalDateFormatter implements Formatter {
ThreadLocal<SimpleDateFormat> formatter = new ThreadLocal<SimpleDateFormat>() {
protected synchronized SimpleDateFormat initialValue() {
return new SimpleDateFormat(ISO8601_PATTERN);
}
};
public String format(Date date) {
return formatter.get().format(date);
}
}
// public static class JodaFormatter {
// DateTimeFormatter formatter = DateTimeFormat.forPattern(ISO8601_PATTERN);
//
// public String format(DateTime date) {
// return formatter.print(date);
// }
// }
public static class DateFormatThread extends Thread {
Formatter formatter;
Date date;
long iterCount;
public DateFormatThread(Formatter f, Date date, long iterations) {
this.formatter = f;
this.date = date;
this.iterCount = iterations;
}
public void run() {
for (int i = 0; i < iterCount; i++) {
formatter.format(this.date);
}
}
}
// public static class DateTimeFormatThread extends Thread {
// JodaFormatter formatter;
// DateTime date;
// long iterCount;
//
// public DateTimeFormatThread(JodaFormatter f, DateTime date, long iterations) {
// this.formatter = f;
// this.date = date;
// this.iterCount = iterations;
// }
//
// public void run() {
// for (int i = 0; i < iterCount; i++) {
// formatter.format(this.date);
// }
// }
// }
}