[tor-commits] [metrics-lib/master] Use a single DateFormat per thread and format.
karsten at torproject.org
karsten at torproject.org
Sun Jun 1 09:46:37 UTC 2014
commit e3945981d1571cc577efc9805882bd1c59ad94c8
Author: Karsten Loesing <karsten.loesing at gmx.net>
Date: Wed May 28 10:07:28 2014 +0200
Use a single DateFormat per thread and format.
DateFormat is not thread-safe, and creating a new instance every time we
need one only wastes CPU time. Make sure that there's a single instance
per thread and format that the thread can use whenever it wants.
---
.../torproject/descriptor/impl/ParseHelper.java | 37 ++++++++++++++++----
1 file changed, 30 insertions(+), 7 deletions(-)
diff --git a/src/org/torproject/descriptor/impl/ParseHelper.java b/src/org/torproject/descriptor/impl/ParseHelper.java
index fd38eb0..8b314fd 100644
--- a/src/org/torproject/descriptor/impl/ParseHelper.java
+++ b/src/org/torproject/descriptor/impl/ParseHelper.java
@@ -2,9 +2,11 @@
* See LICENSE for licensing information */
package org.torproject.descriptor.impl;
+import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
@@ -137,6 +139,32 @@ public class ParseHelper {
return exitPattern;
}
+ private static ThreadLocal<Map<String, DateFormat>> dateFormats =
+ new ThreadLocal<Map<String, DateFormat>> () {
+ public Map<String, DateFormat> get() {
+ return super.get();
+ }
+ protected Map<String, DateFormat> initialValue() {
+ return new HashMap<String, DateFormat>();
+ }
+ public void remove() {
+ super.remove();
+ }
+ public void set(Map<String, DateFormat> value) {
+ super.set(value);
+ }
+ };
+ private static DateFormat getDateFormat(String format) {
+ Map<String, DateFormat> threadDateFormats = dateFormats.get();
+ if (!threadDateFormats.containsKey(format)) {
+ DateFormat dateFormat = new SimpleDateFormat(format);
+ dateFormat.setLenient(false);
+ dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
+ threadDateFormats.put(format, dateFormat);
+ }
+ return threadDateFormats.get(format);
+ }
+
public static long parseTimestampAtIndex(String line, String[] parts,
int dateIndex, int timeIndex) throws DescriptorParseException {
if (dateIndex >= parts.length || timeIndex >= parts.length) {
@@ -145,10 +173,7 @@ public class ParseHelper {
}
long result = -1L;
try {
- SimpleDateFormat dateTimeFormat = new SimpleDateFormat(
- "yyyy-MM-dd HH:mm:ss");
- dateTimeFormat.setLenient(false);
- dateTimeFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
+ DateFormat dateTimeFormat = getDateFormat("yyyy-MM-dd HH:mm:ss");
result = dateTimeFormat.parse(
parts[dateIndex] + " " + parts[timeIndex]).getTime();
} catch (ParseException e) {
@@ -169,9 +194,7 @@ public class ParseHelper {
}
long result = -1L;
try {
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
- dateFormat.setLenient(false);
- dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
+ DateFormat dateFormat = getDateFormat("yyyy-MM-dd");
result = dateFormat.parse(parts[dateIndex]).getTime();
} catch (ParseException e) {
/* Leave result at -1L. */
More information about the tor-commits
mailing list