[
https://issues.apache.org/jira/browse/LANG-1355?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16198383#comment-16198383
]
ASF GitHub Bot commented on LANG-1355:
--------------------------------------
Github user kinow commented on a diff in the pull request:
https://github.com/apache/commons-lang/pull/296#discussion_r143667312
--- Diff: src/test/java/org/apache/commons/lang3/time/GmtTimeZoneTest.java
---
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.lang3.time;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Tests for GmtTimeZone
+ */
+public class GmtTimeZoneTest {
+
+ @Test(expected = IllegalArgumentException.class)
+ public void hoursOutOfRange() {
+ new GmtTimeZone(false, 24, 0);
+ }
+
+ @Test
+ public void hoursInRange() {
+ Assert.assertEquals(23 * 60 * 60 * 1000, new GmtTimeZone(false,
23, 0).getRawOffset());
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void minutesOutOfRange() {
+ Assert.assertEquals(0, new GmtTimeZone(false, 60, 0));
+ }
+
+ @Test
+ public void minutesInRange() {
+ Assert.assertEquals(59 * 60 * 1000, new GmtTimeZone(false, 0,
59).getRawOffset());
+ }
+
+ @Test
+ public void getOffset() {
+ Assert.assertEquals(0, new GmtTimeZone(false, 0,
0).getOffset(234304));
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void setRawOffset() {
+ new GmtTimeZone(false, 0, 0).setRawOffset(0);
+ }
+
+ @Test
+ public void getRawOffset() {
+ Assert.assertEquals(0, new GmtTimeZone(false, 0,
0).getRawOffset());
+ }
+
+ @Test
+ public void getID() {
+ Assert.assertEquals("GMT+00:00", new GmtTimeZone(false, 0,
0).getID());
+ Assert.assertEquals("GMT+01:02", new GmtTimeZone(false, 1,
2).getID());
+ Assert.assertEquals("GMT+11:22", new GmtTimeZone(false, 11,
22).getID());
+ Assert.assertEquals("GMT-01:02", new GmtTimeZone(true, 1,
2).getID());
+ Assert.assertEquals("GMT-11:22", new GmtTimeZone(true, 11,
22).getID());
+ }
+
+ @Test
+ public void useDaylightTime() {
+ Assert.assertFalse(new GmtTimeZone(false, 0, 0).useDaylightTime());
+ }
+
+ @Test
+ public void inDaylightTime() {
+ Assert.assertFalse(new GmtTimeZone(false, 0, 0).useDaylightTime());
+ }
--- End diff --
Maybe add something like
```
@Test
public void testToString() {
Assert.assertEquals("[GmtTimeZone
id=\"GMT+23:00\",offset=82800000]", new GmtTimeZone(false, 23, 0).toString());
}
@Test
public void testGetOffset() {
Assert.assertEquals(82800000, new GmtTimeZone(false, 23,
0).getOffset(1, 1, 1, 1, 1, 1));
}
```
With these two tests we reach 100% for GmtTimeZone.
> TimeZone.getTimeZone() in FastDateParser causes resource contention
> -------------------------------------------------------------------
>
> Key: LANG-1355
> URL: https://issues.apache.org/jira/browse/LANG-1355
> Project: Commons Lang
> Issue Type: Bug
> Components: lang.time.*
> Affects Versions: 3.6
> Environment: Windows
> Reporter: Keith Boone
> Assignee: Charles Honton
> Original Estimate: 48h
> Remaining Estimate: 48h
>
> Under heavy load we are seeing contention in FastDateParser.parse() on calls
> to TimeZone.getTimeZone(). TimeZone.getTimeZone() is a synchronized static
> in the Oracle JVM.
> Our proposed solution is to add a class TimeZoneCache containing a single
> method getTimeZone() which gets the requested time zone from a ConcurrentMap,
> and if not present, looks it up via TimeZone.getTimeZone() and caches it
> before returning it.
> Then replace calls to TimeZone.getTimeZone() in FastDateParser ( and
> whereever else) to calls to TimeZoneCache.getTimeZone().
> The reason to add a separate class is because it can also be used by other
> applications which heavily parse or format or do other things where TimeZone
> is repeatedly needed.
> Under extreme load we have seen an 50:1 improvement in calls to
> FastDateParser.parse(). This saves about a ms/call in our test environment,
> and reduces contention.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)