You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-dev@logging.apache.org by Gary Gregory <ga...@gmail.com> on 2016/02/22 04:32:26 UTC

Fwd: logging-log4j2 git commit: Add PerformanceSensitive annotation.

I wonder if @CriticalPath or @HandOptimized would convey better what we are
trying to express?

Gary


---------- Forwarded message ----------
From: <ma...@apache.org>
Date: Sun, Feb 21, 2016 at 7:02 PM
Subject: logging-log4j2 git commit: Add PerformanceSensitive annotation.
To: commits@logging.apache.org


Repository: logging-log4j2
Updated Branches:
  refs/heads/master f884234a8 -> 4aa7df826


Add PerformanceSensitive annotation.


Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit:
http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/4aa7df82
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/4aa7df82
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/4aa7df82

Branch: refs/heads/master
Commit: 4aa7df826de7e359ac3bde98597fe5ca6e4b5901
Parents: f884234
Author: Matt Sicker <bo...@gmail.com>
Authored: Sun Feb 21 21:02:51 2016 -0600
Committer: Matt Sicker <bo...@gmail.com>
Committed: Sun Feb 21 21:02:51 2016 -0600

----------------------------------------------------------------------
 .../log4j/util/PerformanceSensitive.java        | 29 ++++++++++++++++++++
 .../logging/log4j/util/ReflectionUtil.java      |  5 ++++
 .../log4j/core/config/AppenderControl.java      |  4 +++
 .../core/config/AppenderControlArraySet.java    |  8 ++++--
 4 files changed, 43 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
----------------------------------------------------------------------
diff --git
a/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
new file mode 100644
index 0000000..3fbb058
--- /dev/null
+++
b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
@@ -0,0 +1,29 @@
+/*
+ * 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.logging.log4j.util;
+
+/**
+ * Indicates that a particular annotated construct was written with
certain performance constraints in mind that
+ * should be considered when modifying or testing.
+ *
+ * @since 2.6
+ */
+public @interface PerformanceSensitive {
+    /** Description of why this is written the way it is. */
+    String value() default "";
+}

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
----------------------------------------------------------------------
diff --git
a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
index 6e7ce4a..dec2350 100644
---
a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
+++
b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
@@ -117,6 +117,7 @@ public final class ReflectionUtil {
     // (MS) I believe this would work without any modifications elsewhere,
but I could be wrong

     // migrated from ReflectiveCallerClassUtility
+    @PerformanceSensitive
     public static Class<?> getCallerClass(final int depth) {
         if (depth < 0) {
             throw new IndexOutOfBoundsException(Integer.toString(depth));
@@ -193,11 +194,13 @@ public final class ReflectionUtil {
     }

     // migrated from ClassLoaderContextSelector
+    @PerformanceSensitive
     public static Class<?> getCallerClass(final String fqcn) {
         return getCallerClass(fqcn, Strings.EMPTY);
     }

     // migrated from Log4jLoggerFactory
+    @PerformanceSensitive
     public static Class<?> getCallerClass(final String fqcn, final String
pkg) {
         if (supportsFastReflection()) {
             boolean next = false;
@@ -227,6 +230,7 @@ public final class ReflectionUtil {
     }

     // added for use in LoggerAdapter implementations mainly
+    @PerformanceSensitive
     public static Class<?> getCallerClass(final Class<?> anchor) {
         if (supportsFastReflection()) {
             boolean next = false;
@@ -270,6 +274,7 @@ public final class ReflectionUtil {
     }

     // migrated from ThrowableProxy
+    @PerformanceSensitive
     public static Stack<Class<?>> getCurrentStackTrace() {
         // benchmarks show that using the SecurityManager is much faster
than looping through getCallerClass(int)
         if (SECURITY_MANAGER != null) {

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
----------------------------------------------------------------------
diff --git
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
index f65011d..175c9e1 100644
---
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
+++
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
@@ -25,6 +25,7 @@ import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.appender.AppenderLoggingException;
 import org.apache.logging.log4j.core.filter.AbstractFilterable;
 import org.apache.logging.log4j.core.filter.Filterable;
+import org.apache.logging.log4j.util.PerformanceSensitive;

 /**
  * Wraps an {@link Appender} with details an appender implementation
shouldn't need to know about.
@@ -88,14 +89,17 @@ public class AppenderControl extends AbstractFilterable
{
         return isFilteredByAppenderControl(event) ||
isFilteredByLevel(event) || isRecursiveCall();
     }

+    @PerformanceSensitive
     private boolean isFilteredByAppenderControl(final LogEvent event) {
         return getFilter() != null && Filter.Result.DENY ==
getFilter().filter(event);
     }

+    @PerformanceSensitive
     private boolean isFilteredByLevel(final LogEvent event) {
         return level != null && intLevel < event.getLevel().intLevel();
     }

+    @PerformanceSensitive
     private boolean isRecursiveCall() {
         if (recursive.get() != null) {
             appenderErrorHandlerMessage("Recursive call to appender ");

http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
----------------------------------------------------------------------
diff --git
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
index 78a42b3..d30ce32 100644
---
a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
+++
b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
@@ -16,17 +16,19 @@
  */
 package org.apache.logging.log4j.core.config;

-import org.apache.logging.log4j.core.Appender;
-
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.atomic.AtomicReference;

+import org.apache.logging.log4j.core.Appender;
+import org.apache.logging.log4j.util.PerformanceSensitive;
+
 /**
  * Data structure with similar semantics to CopyOnWriteArraySet, but
giving direct access to the underlying array.
  */
+@PerformanceSensitive
 public class AppenderControlArraySet {
     private final AtomicReference<AppenderControl[]> appenderArray = new
AtomicReference<>(new AppenderControl[0]);

@@ -117,4 +119,4 @@ public class AppenderControlArraySet {
     public AppenderControl[] get() {
         return appenderArray.get();
     }
-}
\ No newline at end of file
+}




-- 
E-Mail: garydgregory@gmail.com | ggregory@apache.org
Java Persistence with Hibernate, Second Edition
<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
Spring Batch in Action <http://www.manning.com/templier/>
Blog: http://garygregory.wordpress.com
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory

Re: logging-log4j2 git commit: Add PerformanceSensitive annotation.

Posted by Ralph Goers <ra...@dslextreme.com>.
I like this. A lot of the logging code is critical path/performance sensitive. Allowing a “reason” or reasons helps a lot.

Ralph

> On Feb 21, 2016, at 9:25 PM, Matt Sicker <bo...@gmail.com> wrote:
> 
> Syntax-wise, you can use either @PerformanceSensitive("foo") or @PerformanceSensitive({"foo", "bar"})
> 
> On 21 February 2016 at 22:23, Matt Sicker <boards@gmail.com <ma...@gmail.com>> wrote:
> I can change it for the former (you need to use a string array, though), the latter is only possible in Java 1.8+.
> 
> On 21 February 2016 at 22:22, Remko Popma <remko.popma@gmail.com <ma...@gmail.com>> wrote:
> Can an annotation have multiple values?
> @PerformanceSensitive("AllocationFree", "CriticalPath")
> 
> Or can a method be annotated with the same annotation appear multiple times?
> Both @PerformanceSensitive("AllocationFree") and @PerformanceSensitive("CriticalPath")?
> 
> 
> On Monday, 22 February 2016, Remko Popma <remko.popma@gmail.com <ma...@gmail.com>> wrote:
> I like @PerformanceSensitive very much!
> 
> I can then see specific variations like
> @PerformanceSensitive("InlineSize")
> @PerformanceSensitive("AllocationFree")
> 
> 
> 
> Sent from my iPhone
> 
> On 2016/02/22, at 12:48, Gary Gregory <garydgregory@gmail.com <>> wrote:
> 
>> Well, a method can be on the critical path and not have been hand-optimized either because it is already as fast as can be or we have not gotten around to it (which make you want to have a @NeedsOptimization, rabbit hole warning!). So we could have both. Some methods would be @CriticalPath, and some both @CriticalPath and @HandOptimized. But you would not have just @HandOptimized or if you did it would imply @CriticalPath. which is a bit too clever ....
>> 
>> Gary
>> 
>> On Sun, Feb 21, 2016 at 7:43 PM, Matt Sicker <boards@gmail.com <>> wrote:
>> Those both sound better, but I can't decide on which.
>> 
>> On 21 February 2016 at 21:32, Gary Gregory <garydgregory@gmail.com <>> wrote:
>> I wonder if @CriticalPath or @HandOptimized would convey better what we are trying to express?
>> 
>> Gary
>> 
>> 
>> ---------- Forwarded message ----------
>> From: <mattsicker@apache.org <>>
>> Date: Sun, Feb 21, 2016 at 7:02 PM
>> Subject: logging-log4j2 git commit: Add PerformanceSensitive annotation.
>> To: commits@logging.apache.org <>
>> 
>> 
>> Repository: logging-log4j2
>> Updated Branches:
>>   refs/heads/master f884234a8 -> 4aa7df826
>> 
>> 
>> Add PerformanceSensitive annotation.
>> 
>> 
>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo <http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo>
>> Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/4aa7df82 <http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/4aa7df82>
>> Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/4aa7df82 <http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/4aa7df82>
>> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/4aa7df82 <http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/4aa7df82>
>> 
>> Branch: refs/heads/master
>> Commit: 4aa7df826de7e359ac3bde98597fe5ca6e4b5901
>> Parents: f884234
>> Author: Matt Sicker <boards@gmail.com <>>
>> Authored: Sun Feb 21 21:02:51 2016 -0600
>> Committer: Matt Sicker <boards@gmail.com <>>
>> Committed: Sun Feb 21 21:02:51 2016 -0600
>> 
>> ----------------------------------------------------------------------
>>  .../log4j/util/PerformanceSensitive.java        | 29 ++++++++++++++++++++
>>  .../logging/log4j/util/ReflectionUtil.java      |  5 ++++
>>  .../log4j/core/config/AppenderControl.java      |  4 +++
>>  .../core/config/AppenderControlArraySet.java    |  8 ++++--
>>  4 files changed, 43 insertions(+), 3 deletions(-)
>> ----------------------------------------------------------------------
>> 
>> 
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java <http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java>
>> ----------------------------------------------------------------------
>> diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>> new file mode 100644
>> index 0000000..3fbb058
>> --- /dev/null
>> +++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>> @@ -0,0 +1,29 @@
>> +/*
>> + * 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 <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.logging.log4j.util;
>> +
>> +/**
>> + * Indicates that a particular annotated construct was written with certain performance constraints in mind that
>> + * should be considered when modifying or testing.
>> + *
>> + * @since 2.6
>> + */
>> +public @interface PerformanceSensitive {
>> +    /** Description of why this is written the way it is. */
>> +    String value() default "";
>> +}
>> 
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java <http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java>
>> ----------------------------------------------------------------------
>> diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>> index 6e7ce4a..dec2350 100644
>> --- a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>> +++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>> @@ -117,6 +117,7 @@ public final class ReflectionUtil {
>>      // (MS) I believe this would work without any modifications elsewhere, but I could be wrong
>> 
>>      // migrated from ReflectiveCallerClassUtility
>> +    @PerformanceSensitive
>>      public static Class<?> getCallerClass(final int depth) {
>>          if (depth < 0) {
>>              throw new IndexOutOfBoundsException(Integer.toString(depth));
>> @@ -193,11 +194,13 @@ public final class ReflectionUtil {
>>      }
>> 
>>      // migrated from ClassLoaderContextSelector
>> +    @PerformanceSensitive
>>      public static Class<?> getCallerClass(final String fqcn) {
>>          return getCallerClass(fqcn, Strings.EMPTY);
>>      }
>> 
>>      // migrated from Log4jLoggerFactory
>> +    @PerformanceSensitive
>>      public static Class<?> getCallerClass(final String fqcn, final String pkg) {
>>          if (supportsFastReflection()) {
>>              boolean next = false;
>> @@ -227,6 +230,7 @@ public final class ReflectionUtil {
>>      }
>> 
>>      // added for use in LoggerAdapter implementations mainly
>> +    @PerformanceSensitive
>>      public static Class<?> getCallerClass(final Class<?> anchor) {
>>          if (supportsFastReflection()) {
>>              boolean next = false;
>> @@ -270,6 +274,7 @@ public final class ReflectionUtil {
>>      }
>> 
>>      // migrated from ThrowableProxy
>> +    @PerformanceSensitive
>>      public static Stack<Class<?>> getCurrentStackTrace() {
>>          // benchmarks show that using the SecurityManager is much faster than looping through getCallerClass(int)
>>          if (SECURITY_MANAGER != null) {
>> 
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java <http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java>
>> ----------------------------------------------------------------------
>> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>> index f65011d..175c9e1 100644
>> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>> @@ -25,6 +25,7 @@ import org.apache.logging.log4j.core.LogEvent;
>>  import org.apache.logging.log4j.core.appender.AppenderLoggingException;
>>  import org.apache.logging.log4j.core.filter.AbstractFilterable;
>>  import org.apache.logging.log4j.core.filter.Filterable;
>> +import org.apache.logging.log4j.util.PerformanceSensitive;
>> 
>>  /**
>>   * Wraps an {@link Appender} with details an appender implementation shouldn't need to know about.
>> @@ -88,14 +89,17 @@ public class AppenderControl extends AbstractFilterable {
>>          return isFilteredByAppenderControl(event) || isFilteredByLevel(event) || isRecursiveCall();
>>      }
>> 
>> +    @PerformanceSensitive
>>      private boolean isFilteredByAppenderControl(final LogEvent event) {
>>          return getFilter() != null && Filter.Result.DENY == getFilter().filter(event);
>>      }
>> 
>> +    @PerformanceSensitive
>>      private boolean isFilteredByLevel(final LogEvent event) {
>>          return level != null && intLevel < event.getLevel().intLevel();
>>      }
>> 
>> +    @PerformanceSensitive
>>      private boolean isRecursiveCall() {
>>          if (recursive.get() != null) {
>>              appenderErrorHandlerMessage("Recursive call to appender ");
>> 
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java <http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java>
>> ----------------------------------------------------------------------
>> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>> index 78a42b3..d30ce32 100644
>> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>> @@ -16,17 +16,19 @@
>>   */
>>  package org.apache.logging.log4j.core.config;
>> 
>> -import org.apache.logging.log4j.core.Appender;
>> -
>>  import java.util.Arrays;
>>  import java.util.HashMap;
>>  import java.util.Map;
>>  import java.util.Objects;
>>  import java.util.concurrent.atomic.AtomicReference;
>> 
>> +import org.apache.logging.log4j.core.Appender;
>> +import org.apache.logging.log4j.util.PerformanceSensitive;
>> +
>>  /**
>>   * Data structure with similar semantics to CopyOnWriteArraySet, but giving direct access to the underlying array.
>>   */
>> +@PerformanceSensitive
>>  public class AppenderControlArraySet {
>>      private final AtomicReference<AppenderControl[]> appenderArray = new AtomicReference<>(new AppenderControl[0]);
>> 
>> @@ -117,4 +119,4 @@ public class AppenderControlArraySet {
>>      public AppenderControl[] get() {
>>          return appenderArray.get();
>>      }
>> -}
>> \ No newline at end of file
>> +}
>> 
>> 
>> 
>> 
>> -- 
>> E-Mail: garydgregory@gmail.com <> | ggregory@apache.org  <>
>> Java Persistence with Hibernate, Second Edition <http://www.manning.com/bauer3/>
>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>> Spring Batch in Action <http://www.manning.com/templier/>
>> Blog: http://garygregory.wordpress.com <http://garygregory.wordpress.com/> 
>> Home: http://garygregory.com/ <http://garygregory.com/>
>> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory>
>> 
>> 
>> -- 
>> Matt Sicker <boards@gmail.com <>>
>> 
>> 
>> 
>> -- 
>> E-Mail: garydgregory@gmail.com <> | ggregory@apache.org  <>
>> Java Persistence with Hibernate, Second Edition <http://www.manning.com/bauer3/>
>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>> Spring Batch in Action <http://www.manning.com/templier/>
>> Blog: http://garygregory.wordpress.com <http://garygregory.wordpress.com/> 
>> Home: http://garygregory.com/ <http://garygregory.com/>
>> Tweet! http://twitter.com/GaryGregory <http://twitter.com/GaryGregory>
> 
> 
> -- 
> Matt Sicker <boards@gmail.com <ma...@gmail.com>>
> 
> 
> 
> -- 
> Matt Sicker <boards@gmail.com <ma...@gmail.com>>


Re: logging-log4j2 git commit: Add PerformanceSensitive annotation.

Posted by Remko Popma <re...@gmail.com>.
Ah, that would be fine!

On Monday, 22 February 2016, Matt Sicker <bo...@gmail.com> wrote:

> Syntax-wise, you can use either @PerformanceSensitive("foo") or
> @PerformanceSensitive({"foo", "bar"})
>
> On 21 February 2016 at 22:23, Matt Sicker <boards@gmail.com
> <javascript:_e(%7B%7D,'cvml','boards@gmail.com');>> wrote:
>
>> I can change it for the former (you need to use a string array, though),
>> the latter is only possible in Java 1.8+.
>>
>> On 21 February 2016 at 22:22, Remko Popma <remko.popma@gmail.com
>> <javascript:_e(%7B%7D,'cvml','remko.popma@gmail.com');>> wrote:
>>
>>> Can an annotation have multiple values?
>>> @PerformanceSensitive("AllocationFree", "CriticalPath")
>>>
>>> Or can a method be annotated with the same annotation appear multiple
>>> times?
>>> Both @PerformanceSensitive("AllocationFree")
>>> and @PerformanceSensitive("CriticalPath")?
>>>
>>>
>>> On Monday, 22 February 2016, Remko Popma <remko.popma@gmail.com
>>> <javascript:_e(%7B%7D,'cvml','remko.popma@gmail.com');>> wrote:
>>>
>>>> I like @PerformanceSensitive very much!
>>>>
>>>> I can then see specific variations like
>>>> @PerformanceSensitive("InlineSize")
>>>> @PerformanceSensitive("AllocationFree")
>>>>
>>>>
>>>>
>>>> Sent from my iPhone
>>>>
>>>> On 2016/02/22, at 12:48, Gary Gregory <ga...@gmail.com> wrote:
>>>>
>>>> Well, a method can be on the critical path and not have been
>>>> hand-optimized either because it is already as fast as can be or we have
>>>> not gotten around to it (which make you want to have a @NeedsOptimization,
>>>> rabbit hole warning!). So we could have both. Some methods would
>>>> be @CriticalPath, and some both @CriticalPath and @HandOptimized. But you
>>>> would not have just @HandOptimized or if you did it would
>>>> imply @CriticalPath. which is a bit too clever ....
>>>>
>>>> Gary
>>>>
>>>> On Sun, Feb 21, 2016 at 7:43 PM, Matt Sicker <bo...@gmail.com> wrote:
>>>>
>>>>> Those both sound better, but I can't decide on which.
>>>>>
>>>>> On 21 February 2016 at 21:32, Gary Gregory <ga...@gmail.com>
>>>>> wrote:
>>>>>
>>>>>> I wonder if @CriticalPath or @HandOptimized would convey better what
>>>>>> we are trying to express?
>>>>>>
>>>>>> Gary
>>>>>>
>>>>>>
>>>>>> ---------- Forwarded message ----------
>>>>>> From: <ma...@apache.org>
>>>>>> Date: Sun, Feb 21, 2016 at 7:02 PM
>>>>>> Subject: logging-log4j2 git commit: Add PerformanceSensitive
>>>>>> annotation.
>>>>>> To: commits@logging.apache.org
>>>>>>
>>>>>>
>>>>>> Repository: logging-log4j2
>>>>>> Updated Branches:
>>>>>>   refs/heads/master f884234a8 -> 4aa7df826
>>>>>>
>>>>>>
>>>>>> Add PerformanceSensitive annotation.
>>>>>>
>>>>>>
>>>>>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
>>>>>> Commit:
>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/4aa7df82
>>>>>> Tree:
>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/4aa7df82
>>>>>> Diff:
>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/4aa7df82
>>>>>>
>>>>>> Branch: refs/heads/master
>>>>>> Commit: 4aa7df826de7e359ac3bde98597fe5ca6e4b5901
>>>>>> Parents: f884234
>>>>>> Author: Matt Sicker <bo...@gmail.com>
>>>>>> Authored: Sun Feb 21 21:02:51 2016 -0600
>>>>>> Committer: Matt Sicker <bo...@gmail.com>
>>>>>> Committed: Sun Feb 21 21:02:51 2016 -0600
>>>>>>
>>>>>> ----------------------------------------------------------------------
>>>>>>  .../log4j/util/PerformanceSensitive.java        | 29
>>>>>> ++++++++++++++++++++
>>>>>>  .../logging/log4j/util/ReflectionUtil.java      |  5 ++++
>>>>>>  .../log4j/core/config/AppenderControl.java      |  4 +++
>>>>>>  .../core/config/AppenderControlArraySet.java    |  8 ++++--
>>>>>>  4 files changed, 43 insertions(+), 3 deletions(-)
>>>>>> ----------------------------------------------------------------------
>>>>>>
>>>>>>
>>>>>>
>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>>>>> ----------------------------------------------------------------------
>>>>>> diff --git
>>>>>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>>>>> new file mode 100644
>>>>>> index 0000000..3fbb058
>>>>>> --- /dev/null
>>>>>> +++
>>>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>>>>> @@ -0,0 +1,29 @@
>>>>>> +/*
>>>>>> + * 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.logging.log4j.util;
>>>>>> +
>>>>>> +/**
>>>>>> + * Indicates that a particular annotated construct was written with
>>>>>> certain performance constraints in mind that
>>>>>> + * should be considered when modifying or testing.
>>>>>> + *
>>>>>> + * @since 2.6
>>>>>> + */
>>>>>> +public @interface PerformanceSensitive {
>>>>>> +    /** Description of why this is written the way it is. */
>>>>>> +    String value() default "";
>>>>>> +}
>>>>>>
>>>>>>
>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>>>>> ----------------------------------------------------------------------
>>>>>> diff --git
>>>>>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>>>>> index 6e7ce4a..dec2350 100644
>>>>>> ---
>>>>>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>>>>> +++
>>>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>>>>> @@ -117,6 +117,7 @@ public final class ReflectionUtil {
>>>>>>      // (MS) I believe this would work without any modifications
>>>>>> elsewhere, but I could be wrong
>>>>>>
>>>>>>      // migrated from ReflectiveCallerClassUtility
>>>>>> +    @PerformanceSensitive
>>>>>>      public static Class<?> getCallerClass(final int depth) {
>>>>>>          if (depth < 0) {
>>>>>>              throw new
>>>>>> IndexOutOfBoundsException(Integer.toString(depth));
>>>>>> @@ -193,11 +194,13 @@ public final class ReflectionUtil {
>>>>>>      }
>>>>>>
>>>>>>      // migrated from ClassLoaderContextSelector
>>>>>> +    @PerformanceSensitive
>>>>>>      public static Class<?> getCallerClass(final String fqcn) {
>>>>>>          return getCallerClass(fqcn, Strings.EMPTY);
>>>>>>      }
>>>>>>
>>>>>>      // migrated from Log4jLoggerFactory
>>>>>> +    @PerformanceSensitive
>>>>>>      public static Class<?> getCallerClass(final String fqcn, final
>>>>>> String pkg) {
>>>>>>          if (supportsFastReflection()) {
>>>>>>              boolean next = false;
>>>>>> @@ -227,6 +230,7 @@ public final class ReflectionUtil {
>>>>>>      }
>>>>>>
>>>>>>      // added for use in LoggerAdapter implementations mainly
>>>>>> +    @PerformanceSensitive
>>>>>>      public static Class<?> getCallerClass(final Class<?> anchor) {
>>>>>>          if (supportsFastReflection()) {
>>>>>>              boolean next = false;
>>>>>> @@ -270,6 +274,7 @@ public final class ReflectionUtil {
>>>>>>      }
>>>>>>
>>>>>>      // migrated from ThrowableProxy
>>>>>> +    @PerformanceSensitive
>>>>>>      public static Stack<Class<?>> getCurrentStackTrace() {
>>>>>>          // benchmarks show that using the SecurityManager is much
>>>>>> faster than looping through getCallerClass(int)
>>>>>>          if (SECURITY_MANAGER != null) {
>>>>>>
>>>>>>
>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>>>>> ----------------------------------------------------------------------
>>>>>> diff --git
>>>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>>>>> index f65011d..175c9e1 100644
>>>>>> ---
>>>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>>>>> +++
>>>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>>>>> @@ -25,6 +25,7 @@ import org.apache.logging.log4j.core.LogEvent;
>>>>>>  import
>>>>>> org.apache.logging.log4j.core.appender.AppenderLoggingException;
>>>>>>  import org.apache.logging.log4j.core.filter.AbstractFilterable;
>>>>>>  import org.apache.logging.log4j.core.filter.Filterable;
>>>>>> +import org.apache.logging.log4j.util.PerformanceSensitive;
>>>>>>
>>>>>>  /**
>>>>>>   * Wraps an {@link Appender} with details an appender implementation
>>>>>> shouldn't need to know about.
>>>>>> @@ -88,14 +89,17 @@ public class AppenderControl extends
>>>>>> AbstractFilterable {
>>>>>>          return isFilteredByAppenderControl(event) ||
>>>>>> isFilteredByLevel(event) || isRecursiveCall();
>>>>>>      }
>>>>>>
>>>>>> +    @PerformanceSensitive
>>>>>>      private boolean isFilteredByAppenderControl(final LogEvent
>>>>>> event) {
>>>>>>          return getFilter() != null && Filter.Result.DENY ==
>>>>>> getFilter().filter(event);
>>>>>>      }
>>>>>>
>>>>>> +    @PerformanceSensitive
>>>>>>      private boolean isFilteredByLevel(final LogEvent event) {
>>>>>>          return level != null && intLevel <
>>>>>> event.getLevel().intLevel();
>>>>>>      }
>>>>>>
>>>>>> +    @PerformanceSensitive
>>>>>>      private boolean isRecursiveCall() {
>>>>>>          if (recursive.get() != null) {
>>>>>>              appenderErrorHandlerMessage("Recursive call to appender
>>>>>> ");
>>>>>>
>>>>>>
>>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>>>>> ----------------------------------------------------------------------
>>>>>> diff --git
>>>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>>>>> index 78a42b3..d30ce32 100644
>>>>>> ---
>>>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>>>>> +++
>>>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>>>>> @@ -16,17 +16,19 @@
>>>>>>   */
>>>>>>  package org.apache.logging.log4j.core.config;
>>>>>>
>>>>>> -import org.apache.logging.log4j.core.Appender;
>>>>>> -
>>>>>>  import java.util.Arrays;
>>>>>>  import java.util.HashMap;
>>>>>>  import java.util.Map;
>>>>>>  import java.util.Objects;
>>>>>>  import java.util.concurrent.atomic.AtomicReference;
>>>>>>
>>>>>> +import org.apache.logging.log4j.core.Appender;
>>>>>> +import org.apache.logging.log4j.util.PerformanceSensitive;
>>>>>> +
>>>>>>  /**
>>>>>>   * Data structure with similar semantics to CopyOnWriteArraySet, but
>>>>>> giving direct access to the underlying array.
>>>>>>   */
>>>>>> +@PerformanceSensitive
>>>>>>  public class AppenderControlArraySet {
>>>>>>      private final AtomicReference<AppenderControl[]> appenderArray =
>>>>>> new AtomicReference<>(new AppenderControl[0]);
>>>>>>
>>>>>> @@ -117,4 +119,4 @@ public class AppenderControlArraySet {
>>>>>>      public AppenderControl[] get() {
>>>>>>          return appenderArray.get();
>>>>>>      }
>>>>>> -}
>>>>>> \ No newline at end of file
>>>>>> +}
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> E-Mail: garydgregory@gmail.com | ggregory@apache.org
>>>>>> Java Persistence with Hibernate, Second Edition
>>>>>> <http://www.manning.com/bauer3/>
>>>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>>>>> Spring Batch in Action <http://www.manning.com/templier/>
>>>>>> Blog: http://garygregory.wordpress.com
>>>>>> Home: http://garygregory.com/
>>>>>> Tweet! http://twitter.com/GaryGregory
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Matt Sicker <bo...@gmail.com>
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> E-Mail: garydgregory@gmail.com | ggregory@apache.org
>>>> Java Persistence with Hibernate, Second Edition
>>>> <http://www.manning.com/bauer3/>
>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>>> Spring Batch in Action <http://www.manning.com/templier/>
>>>> Blog: http://garygregory.wordpress.com
>>>> Home: http://garygregory.com/
>>>> Tweet! http://twitter.com/GaryGregory
>>>>
>>>>
>>
>>
>> --
>> Matt Sicker <boards@gmail.com
>> <javascript:_e(%7B%7D,'cvml','boards@gmail.com');>>
>>
>
>
>
> --
> Matt Sicker <boards@gmail.com
> <javascript:_e(%7B%7D,'cvml','boards@gmail.com');>>
>

Re: logging-log4j2 git commit: Add PerformanceSensitive annotation.

Posted by Matt Sicker <bo...@gmail.com>.
Syntax-wise, you can use either @PerformanceSensitive("foo") or
@PerformanceSensitive({"foo", "bar"})

On 21 February 2016 at 22:23, Matt Sicker <bo...@gmail.com> wrote:

> I can change it for the former (you need to use a string array, though),
> the latter is only possible in Java 1.8+.
>
> On 21 February 2016 at 22:22, Remko Popma <re...@gmail.com> wrote:
>
>> Can an annotation have multiple values?
>> @PerformanceSensitive("AllocationFree", "CriticalPath")
>>
>> Or can a method be annotated with the same annotation appear multiple
>> times?
>> Both @PerformanceSensitive("AllocationFree")
>> and @PerformanceSensitive("CriticalPath")?
>>
>>
>> On Monday, 22 February 2016, Remko Popma <re...@gmail.com> wrote:
>>
>>> I like @PerformanceSensitive very much!
>>>
>>> I can then see specific variations like
>>> @PerformanceSensitive("InlineSize")
>>> @PerformanceSensitive("AllocationFree")
>>>
>>>
>>>
>>> Sent from my iPhone
>>>
>>> On 2016/02/22, at 12:48, Gary Gregory <ga...@gmail.com> wrote:
>>>
>>> Well, a method can be on the critical path and not have been
>>> hand-optimized either because it is already as fast as can be or we have
>>> not gotten around to it (which make you want to have a @NeedsOptimization,
>>> rabbit hole warning!). So we could have both. Some methods would
>>> be @CriticalPath, and some both @CriticalPath and @HandOptimized. But you
>>> would not have just @HandOptimized or if you did it would
>>> imply @CriticalPath. which is a bit too clever ....
>>>
>>> Gary
>>>
>>> On Sun, Feb 21, 2016 at 7:43 PM, Matt Sicker <bo...@gmail.com> wrote:
>>>
>>>> Those both sound better, but I can't decide on which.
>>>>
>>>> On 21 February 2016 at 21:32, Gary Gregory <ga...@gmail.com>
>>>> wrote:
>>>>
>>>>> I wonder if @CriticalPath or @HandOptimized would convey better what
>>>>> we are trying to express?
>>>>>
>>>>> Gary
>>>>>
>>>>>
>>>>> ---------- Forwarded message ----------
>>>>> From: <ma...@apache.org>
>>>>> Date: Sun, Feb 21, 2016 at 7:02 PM
>>>>> Subject: logging-log4j2 git commit: Add PerformanceSensitive
>>>>> annotation.
>>>>> To: commits@logging.apache.org
>>>>>
>>>>>
>>>>> Repository: logging-log4j2
>>>>> Updated Branches:
>>>>>   refs/heads/master f884234a8 -> 4aa7df826
>>>>>
>>>>>
>>>>> Add PerformanceSensitive annotation.
>>>>>
>>>>>
>>>>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
>>>>> Commit:
>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/4aa7df82
>>>>> Tree:
>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/4aa7df82
>>>>> Diff:
>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/4aa7df82
>>>>>
>>>>> Branch: refs/heads/master
>>>>> Commit: 4aa7df826de7e359ac3bde98597fe5ca6e4b5901
>>>>> Parents: f884234
>>>>> Author: Matt Sicker <bo...@gmail.com>
>>>>> Authored: Sun Feb 21 21:02:51 2016 -0600
>>>>> Committer: Matt Sicker <bo...@gmail.com>
>>>>> Committed: Sun Feb 21 21:02:51 2016 -0600
>>>>>
>>>>> ----------------------------------------------------------------------
>>>>>  .../log4j/util/PerformanceSensitive.java        | 29
>>>>> ++++++++++++++++++++
>>>>>  .../logging/log4j/util/ReflectionUtil.java      |  5 ++++
>>>>>  .../log4j/core/config/AppenderControl.java      |  4 +++
>>>>>  .../core/config/AppenderControlArraySet.java    |  8 ++++--
>>>>>  4 files changed, 43 insertions(+), 3 deletions(-)
>>>>> ----------------------------------------------------------------------
>>>>>
>>>>>
>>>>>
>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>>>> ----------------------------------------------------------------------
>>>>> diff --git
>>>>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>>>> new file mode 100644
>>>>> index 0000000..3fbb058
>>>>> --- /dev/null
>>>>> +++
>>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>>>> @@ -0,0 +1,29 @@
>>>>> +/*
>>>>> + * 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.logging.log4j.util;
>>>>> +
>>>>> +/**
>>>>> + * Indicates that a particular annotated construct was written with
>>>>> certain performance constraints in mind that
>>>>> + * should be considered when modifying or testing.
>>>>> + *
>>>>> + * @since 2.6
>>>>> + */
>>>>> +public @interface PerformanceSensitive {
>>>>> +    /** Description of why this is written the way it is. */
>>>>> +    String value() default "";
>>>>> +}
>>>>>
>>>>>
>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>>>> ----------------------------------------------------------------------
>>>>> diff --git
>>>>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>>>> index 6e7ce4a..dec2350 100644
>>>>> ---
>>>>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>>>> +++
>>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>>>> @@ -117,6 +117,7 @@ public final class ReflectionUtil {
>>>>>      // (MS) I believe this would work without any modifications
>>>>> elsewhere, but I could be wrong
>>>>>
>>>>>      // migrated from ReflectiveCallerClassUtility
>>>>> +    @PerformanceSensitive
>>>>>      public static Class<?> getCallerClass(final int depth) {
>>>>>          if (depth < 0) {
>>>>>              throw new
>>>>> IndexOutOfBoundsException(Integer.toString(depth));
>>>>> @@ -193,11 +194,13 @@ public final class ReflectionUtil {
>>>>>      }
>>>>>
>>>>>      // migrated from ClassLoaderContextSelector
>>>>> +    @PerformanceSensitive
>>>>>      public static Class<?> getCallerClass(final String fqcn) {
>>>>>          return getCallerClass(fqcn, Strings.EMPTY);
>>>>>      }
>>>>>
>>>>>      // migrated from Log4jLoggerFactory
>>>>> +    @PerformanceSensitive
>>>>>      public static Class<?> getCallerClass(final String fqcn, final
>>>>> String pkg) {
>>>>>          if (supportsFastReflection()) {
>>>>>              boolean next = false;
>>>>> @@ -227,6 +230,7 @@ public final class ReflectionUtil {
>>>>>      }
>>>>>
>>>>>      // added for use in LoggerAdapter implementations mainly
>>>>> +    @PerformanceSensitive
>>>>>      public static Class<?> getCallerClass(final Class<?> anchor) {
>>>>>          if (supportsFastReflection()) {
>>>>>              boolean next = false;
>>>>> @@ -270,6 +274,7 @@ public final class ReflectionUtil {
>>>>>      }
>>>>>
>>>>>      // migrated from ThrowableProxy
>>>>> +    @PerformanceSensitive
>>>>>      public static Stack<Class<?>> getCurrentStackTrace() {
>>>>>          // benchmarks show that using the SecurityManager is much
>>>>> faster than looping through getCallerClass(int)
>>>>>          if (SECURITY_MANAGER != null) {
>>>>>
>>>>>
>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>>>> ----------------------------------------------------------------------
>>>>> diff --git
>>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>>>> index f65011d..175c9e1 100644
>>>>> ---
>>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>>>> +++
>>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>>>> @@ -25,6 +25,7 @@ import org.apache.logging.log4j.core.LogEvent;
>>>>>  import
>>>>> org.apache.logging.log4j.core.appender.AppenderLoggingException;
>>>>>  import org.apache.logging.log4j.core.filter.AbstractFilterable;
>>>>>  import org.apache.logging.log4j.core.filter.Filterable;
>>>>> +import org.apache.logging.log4j.util.PerformanceSensitive;
>>>>>
>>>>>  /**
>>>>>   * Wraps an {@link Appender} with details an appender implementation
>>>>> shouldn't need to know about.
>>>>> @@ -88,14 +89,17 @@ public class AppenderControl extends
>>>>> AbstractFilterable {
>>>>>          return isFilteredByAppenderControl(event) ||
>>>>> isFilteredByLevel(event) || isRecursiveCall();
>>>>>      }
>>>>>
>>>>> +    @PerformanceSensitive
>>>>>      private boolean isFilteredByAppenderControl(final LogEvent event)
>>>>> {
>>>>>          return getFilter() != null && Filter.Result.DENY ==
>>>>> getFilter().filter(event);
>>>>>      }
>>>>>
>>>>> +    @PerformanceSensitive
>>>>>      private boolean isFilteredByLevel(final LogEvent event) {
>>>>>          return level != null && intLevel <
>>>>> event.getLevel().intLevel();
>>>>>      }
>>>>>
>>>>> +    @PerformanceSensitive
>>>>>      private boolean isRecursiveCall() {
>>>>>          if (recursive.get() != null) {
>>>>>              appenderErrorHandlerMessage("Recursive call to appender
>>>>> ");
>>>>>
>>>>>
>>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>>>> ----------------------------------------------------------------------
>>>>> diff --git
>>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>>>> index 78a42b3..d30ce32 100644
>>>>> ---
>>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>>>> +++
>>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>>>> @@ -16,17 +16,19 @@
>>>>>   */
>>>>>  package org.apache.logging.log4j.core.config;
>>>>>
>>>>> -import org.apache.logging.log4j.core.Appender;
>>>>> -
>>>>>  import java.util.Arrays;
>>>>>  import java.util.HashMap;
>>>>>  import java.util.Map;
>>>>>  import java.util.Objects;
>>>>>  import java.util.concurrent.atomic.AtomicReference;
>>>>>
>>>>> +import org.apache.logging.log4j.core.Appender;
>>>>> +import org.apache.logging.log4j.util.PerformanceSensitive;
>>>>> +
>>>>>  /**
>>>>>   * Data structure with similar semantics to CopyOnWriteArraySet, but
>>>>> giving direct access to the underlying array.
>>>>>   */
>>>>> +@PerformanceSensitive
>>>>>  public class AppenderControlArraySet {
>>>>>      private final AtomicReference<AppenderControl[]> appenderArray =
>>>>> new AtomicReference<>(new AppenderControl[0]);
>>>>>
>>>>> @@ -117,4 +119,4 @@ public class AppenderControlArraySet {
>>>>>      public AppenderControl[] get() {
>>>>>          return appenderArray.get();
>>>>>      }
>>>>> -}
>>>>> \ No newline at end of file
>>>>> +}
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> E-Mail: garydgregory@gmail.com | ggregory@apache.org
>>>>> Java Persistence with Hibernate, Second Edition
>>>>> <http://www.manning.com/bauer3/>
>>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>>>> Spring Batch in Action <http://www.manning.com/templier/>
>>>>> Blog: http://garygregory.wordpress.com
>>>>> Home: http://garygregory.com/
>>>>> Tweet! http://twitter.com/GaryGregory
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Matt Sicker <bo...@gmail.com>
>>>>
>>>
>>>
>>>
>>> --
>>> E-Mail: garydgregory@gmail.com | ggregory@apache.org
>>> Java Persistence with Hibernate, Second Edition
>>> <http://www.manning.com/bauer3/>
>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>> Spring Batch in Action <http://www.manning.com/templier/>
>>> Blog: http://garygregory.wordpress.com
>>> Home: http://garygregory.com/
>>> Tweet! http://twitter.com/GaryGregory
>>>
>>>
>
>
> --
> Matt Sicker <bo...@gmail.com>
>



-- 
Matt Sicker <bo...@gmail.com>

Re: logging-log4j2 git commit: Add PerformanceSensitive annotation.

Posted by Matt Sicker <bo...@gmail.com>.
I can change it for the former (you need to use a string array, though),
the latter is only possible in Java 1.8+.

On 21 February 2016 at 22:22, Remko Popma <re...@gmail.com> wrote:

> Can an annotation have multiple values?
> @PerformanceSensitive("AllocationFree", "CriticalPath")
>
> Or can a method be annotated with the same annotation appear multiple
> times?
> Both @PerformanceSensitive("AllocationFree")
> and @PerformanceSensitive("CriticalPath")?
>
>
> On Monday, 22 February 2016, Remko Popma <re...@gmail.com> wrote:
>
>> I like @PerformanceSensitive very much!
>>
>> I can then see specific variations like
>> @PerformanceSensitive("InlineSize")
>> @PerformanceSensitive("AllocationFree")
>>
>>
>>
>> Sent from my iPhone
>>
>> On 2016/02/22, at 12:48, Gary Gregory <ga...@gmail.com> wrote:
>>
>> Well, a method can be on the critical path and not have been
>> hand-optimized either because it is already as fast as can be or we have
>> not gotten around to it (which make you want to have a @NeedsOptimization,
>> rabbit hole warning!). So we could have both. Some methods would
>> be @CriticalPath, and some both @CriticalPath and @HandOptimized. But you
>> would not have just @HandOptimized or if you did it would
>> imply @CriticalPath. which is a bit too clever ....
>>
>> Gary
>>
>> On Sun, Feb 21, 2016 at 7:43 PM, Matt Sicker <bo...@gmail.com> wrote:
>>
>>> Those both sound better, but I can't decide on which.
>>>
>>> On 21 February 2016 at 21:32, Gary Gregory <ga...@gmail.com>
>>> wrote:
>>>
>>>> I wonder if @CriticalPath or @HandOptimized would convey better what we
>>>> are trying to express?
>>>>
>>>> Gary
>>>>
>>>>
>>>> ---------- Forwarded message ----------
>>>> From: <ma...@apache.org>
>>>> Date: Sun, Feb 21, 2016 at 7:02 PM
>>>> Subject: logging-log4j2 git commit: Add PerformanceSensitive annotation.
>>>> To: commits@logging.apache.org
>>>>
>>>>
>>>> Repository: logging-log4j2
>>>> Updated Branches:
>>>>   refs/heads/master f884234a8 -> 4aa7df826
>>>>
>>>>
>>>> Add PerformanceSensitive annotation.
>>>>
>>>>
>>>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
>>>> Commit:
>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/4aa7df82
>>>> Tree:
>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/4aa7df82
>>>> Diff:
>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/4aa7df82
>>>>
>>>> Branch: refs/heads/master
>>>> Commit: 4aa7df826de7e359ac3bde98597fe5ca6e4b5901
>>>> Parents: f884234
>>>> Author: Matt Sicker <bo...@gmail.com>
>>>> Authored: Sun Feb 21 21:02:51 2016 -0600
>>>> Committer: Matt Sicker <bo...@gmail.com>
>>>> Committed: Sun Feb 21 21:02:51 2016 -0600
>>>>
>>>> ----------------------------------------------------------------------
>>>>  .../log4j/util/PerformanceSensitive.java        | 29
>>>> ++++++++++++++++++++
>>>>  .../logging/log4j/util/ReflectionUtil.java      |  5 ++++
>>>>  .../log4j/core/config/AppenderControl.java      |  4 +++
>>>>  .../core/config/AppenderControlArraySet.java    |  8 ++++--
>>>>  4 files changed, 43 insertions(+), 3 deletions(-)
>>>> ----------------------------------------------------------------------
>>>>
>>>>
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>>> ----------------------------------------------------------------------
>>>> diff --git
>>>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>>> new file mode 100644
>>>> index 0000000..3fbb058
>>>> --- /dev/null
>>>> +++
>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>>> @@ -0,0 +1,29 @@
>>>> +/*
>>>> + * 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.logging.log4j.util;
>>>> +
>>>> +/**
>>>> + * Indicates that a particular annotated construct was written with
>>>> certain performance constraints in mind that
>>>> + * should be considered when modifying or testing.
>>>> + *
>>>> + * @since 2.6
>>>> + */
>>>> +public @interface PerformanceSensitive {
>>>> +    /** Description of why this is written the way it is. */
>>>> +    String value() default "";
>>>> +}
>>>>
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>>> ----------------------------------------------------------------------
>>>> diff --git
>>>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>>> index 6e7ce4a..dec2350 100644
>>>> ---
>>>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>>> +++
>>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>>> @@ -117,6 +117,7 @@ public final class ReflectionUtil {
>>>>      // (MS) I believe this would work without any modifications
>>>> elsewhere, but I could be wrong
>>>>
>>>>      // migrated from ReflectiveCallerClassUtility
>>>> +    @PerformanceSensitive
>>>>      public static Class<?> getCallerClass(final int depth) {
>>>>          if (depth < 0) {
>>>>              throw new
>>>> IndexOutOfBoundsException(Integer.toString(depth));
>>>> @@ -193,11 +194,13 @@ public final class ReflectionUtil {
>>>>      }
>>>>
>>>>      // migrated from ClassLoaderContextSelector
>>>> +    @PerformanceSensitive
>>>>      public static Class<?> getCallerClass(final String fqcn) {
>>>>          return getCallerClass(fqcn, Strings.EMPTY);
>>>>      }
>>>>
>>>>      // migrated from Log4jLoggerFactory
>>>> +    @PerformanceSensitive
>>>>      public static Class<?> getCallerClass(final String fqcn, final
>>>> String pkg) {
>>>>          if (supportsFastReflection()) {
>>>>              boolean next = false;
>>>> @@ -227,6 +230,7 @@ public final class ReflectionUtil {
>>>>      }
>>>>
>>>>      // added for use in LoggerAdapter implementations mainly
>>>> +    @PerformanceSensitive
>>>>      public static Class<?> getCallerClass(final Class<?> anchor) {
>>>>          if (supportsFastReflection()) {
>>>>              boolean next = false;
>>>> @@ -270,6 +274,7 @@ public final class ReflectionUtil {
>>>>      }
>>>>
>>>>      // migrated from ThrowableProxy
>>>> +    @PerformanceSensitive
>>>>      public static Stack<Class<?>> getCurrentStackTrace() {
>>>>          // benchmarks show that using the SecurityManager is much
>>>> faster than looping through getCallerClass(int)
>>>>          if (SECURITY_MANAGER != null) {
>>>>
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>>> ----------------------------------------------------------------------
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>>> index f65011d..175c9e1 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>>> +++
>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>>> @@ -25,6 +25,7 @@ import org.apache.logging.log4j.core.LogEvent;
>>>>  import org.apache.logging.log4j.core.appender.AppenderLoggingException;
>>>>  import org.apache.logging.log4j.core.filter.AbstractFilterable;
>>>>  import org.apache.logging.log4j.core.filter.Filterable;
>>>> +import org.apache.logging.log4j.util.PerformanceSensitive;
>>>>
>>>>  /**
>>>>   * Wraps an {@link Appender} with details an appender implementation
>>>> shouldn't need to know about.
>>>> @@ -88,14 +89,17 @@ public class AppenderControl extends
>>>> AbstractFilterable {
>>>>          return isFilteredByAppenderControl(event) ||
>>>> isFilteredByLevel(event) || isRecursiveCall();
>>>>      }
>>>>
>>>> +    @PerformanceSensitive
>>>>      private boolean isFilteredByAppenderControl(final LogEvent event) {
>>>>          return getFilter() != null && Filter.Result.DENY ==
>>>> getFilter().filter(event);
>>>>      }
>>>>
>>>> +    @PerformanceSensitive
>>>>      private boolean isFilteredByLevel(final LogEvent event) {
>>>>          return level != null && intLevel < event.getLevel().intLevel();
>>>>      }
>>>>
>>>> +    @PerformanceSensitive
>>>>      private boolean isRecursiveCall() {
>>>>          if (recursive.get() != null) {
>>>>              appenderErrorHandlerMessage("Recursive call to appender ");
>>>>
>>>>
>>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>>> ----------------------------------------------------------------------
>>>> diff --git
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>>> index 78a42b3..d30ce32 100644
>>>> ---
>>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>>> +++
>>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>>> @@ -16,17 +16,19 @@
>>>>   */
>>>>  package org.apache.logging.log4j.core.config;
>>>>
>>>> -import org.apache.logging.log4j.core.Appender;
>>>> -
>>>>  import java.util.Arrays;
>>>>  import java.util.HashMap;
>>>>  import java.util.Map;
>>>>  import java.util.Objects;
>>>>  import java.util.concurrent.atomic.AtomicReference;
>>>>
>>>> +import org.apache.logging.log4j.core.Appender;
>>>> +import org.apache.logging.log4j.util.PerformanceSensitive;
>>>> +
>>>>  /**
>>>>   * Data structure with similar semantics to CopyOnWriteArraySet, but
>>>> giving direct access to the underlying array.
>>>>   */
>>>> +@PerformanceSensitive
>>>>  public class AppenderControlArraySet {
>>>>      private final AtomicReference<AppenderControl[]> appenderArray =
>>>> new AtomicReference<>(new AppenderControl[0]);
>>>>
>>>> @@ -117,4 +119,4 @@ public class AppenderControlArraySet {
>>>>      public AppenderControl[] get() {
>>>>          return appenderArray.get();
>>>>      }
>>>> -}
>>>> \ No newline at end of file
>>>> +}
>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> E-Mail: garydgregory@gmail.com | ggregory@apache.org
>>>> Java Persistence with Hibernate, Second Edition
>>>> <http://www.manning.com/bauer3/>
>>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>>> Spring Batch in Action <http://www.manning.com/templier/>
>>>> Blog: http://garygregory.wordpress.com
>>>> Home: http://garygregory.com/
>>>> Tweet! http://twitter.com/GaryGregory
>>>>
>>>
>>>
>>>
>>> --
>>> Matt Sicker <bo...@gmail.com>
>>>
>>
>>
>>
>> --
>> E-Mail: garydgregory@gmail.com | ggregory@apache.org
>> Java Persistence with Hibernate, Second Edition
>> <http://www.manning.com/bauer3/>
>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>> Spring Batch in Action <http://www.manning.com/templier/>
>> Blog: http://garygregory.wordpress.com
>> Home: http://garygregory.com/
>> Tweet! http://twitter.com/GaryGregory
>>
>>


-- 
Matt Sicker <bo...@gmail.com>

Re: logging-log4j2 git commit: Add PerformanceSensitive annotation.

Posted by Remko Popma <re...@gmail.com>.
Can an annotation have multiple values?
@PerformanceSensitive("AllocationFree", "CriticalPath")

Or can a method be annotated with the same annotation appear multiple times?
Both @PerformanceSensitive("AllocationFree")
and @PerformanceSensitive("CriticalPath")?

On Monday, 22 February 2016, Remko Popma <re...@gmail.com> wrote:

> I like @PerformanceSensitive very much!
>
> I can then see specific variations like
> @PerformanceSensitive("InlineSize")
> @PerformanceSensitive("AllocationFree")
>
>
>
> Sent from my iPhone
>
> On 2016/02/22, at 12:48, Gary Gregory <garydgregory@gmail.com
> <javascript:_e(%7B%7D,'cvml','garydgregory@gmail.com');>> wrote:
>
> Well, a method can be on the critical path and not have been
> hand-optimized either because it is already as fast as can be or we have
> not gotten around to it (which make you want to have a @NeedsOptimization,
> rabbit hole warning!). So we could have both. Some methods would
> be @CriticalPath, and some both @CriticalPath and @HandOptimized. But you
> would not have just @HandOptimized or if you did it would
> imply @CriticalPath. which is a bit too clever ....
>
> Gary
>
> On Sun, Feb 21, 2016 at 7:43 PM, Matt Sicker <boards@gmail.com
> <javascript:_e(%7B%7D,'cvml','boards@gmail.com');>> wrote:
>
>> Those both sound better, but I can't decide on which.
>>
>> On 21 February 2016 at 21:32, Gary Gregory <garydgregory@gmail.com
>> <javascript:_e(%7B%7D,'cvml','garydgregory@gmail.com');>> wrote:
>>
>>> I wonder if @CriticalPath or @HandOptimized would convey better what we
>>> are trying to express?
>>>
>>> Gary
>>>
>>>
>>> ---------- Forwarded message ----------
>>> From: <mattsicker@apache.org
>>> <javascript:_e(%7B%7D,'cvml','mattsicker@apache.org');>>
>>> Date: Sun, Feb 21, 2016 at 7:02 PM
>>> Subject: logging-log4j2 git commit: Add PerformanceSensitive annotation.
>>> To: commits@logging.apache.org
>>> <javascript:_e(%7B%7D,'cvml','commits@logging.apache.org');>
>>>
>>>
>>> Repository: logging-log4j2
>>> Updated Branches:
>>>   refs/heads/master f884234a8 -> 4aa7df826
>>>
>>>
>>> Add PerformanceSensitive annotation.
>>>
>>>
>>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
>>> Commit:
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/4aa7df82
>>> Tree:
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/4aa7df82
>>> Diff:
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/4aa7df82
>>>
>>> Branch: refs/heads/master
>>> Commit: 4aa7df826de7e359ac3bde98597fe5ca6e4b5901
>>> Parents: f884234
>>> Author: Matt Sicker <boards@gmail.com
>>> <javascript:_e(%7B%7D,'cvml','boards@gmail.com');>>
>>> Authored: Sun Feb 21 21:02:51 2016 -0600
>>> Committer: Matt Sicker <boards@gmail.com
>>> <javascript:_e(%7B%7D,'cvml','boards@gmail.com');>>
>>> Committed: Sun Feb 21 21:02:51 2016 -0600
>>>
>>> ----------------------------------------------------------------------
>>>  .../log4j/util/PerformanceSensitive.java        | 29
>>> ++++++++++++++++++++
>>>  .../logging/log4j/util/ReflectionUtil.java      |  5 ++++
>>>  .../log4j/core/config/AppenderControl.java      |  4 +++
>>>  .../core/config/AppenderControlArraySet.java    |  8 ++++--
>>>  4 files changed, 43 insertions(+), 3 deletions(-)
>>> ----------------------------------------------------------------------
>>>
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>> ----------------------------------------------------------------------
>>> diff --git
>>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>> new file mode 100644
>>> index 0000000..3fbb058
>>> --- /dev/null
>>> +++
>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>> @@ -0,0 +1,29 @@
>>> +/*
>>> + * 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.logging.log4j.util;
>>> +
>>> +/**
>>> + * Indicates that a particular annotated construct was written with
>>> certain performance constraints in mind that
>>> + * should be considered when modifying or testing.
>>> + *
>>> + * @since 2.6
>>> + */
>>> +public @interface PerformanceSensitive {
>>> +    /** Description of why this is written the way it is. */
>>> +    String value() default "";
>>> +}
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>> ----------------------------------------------------------------------
>>> diff --git
>>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>> index 6e7ce4a..dec2350 100644
>>> ---
>>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>> +++
>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>> @@ -117,6 +117,7 @@ public final class ReflectionUtil {
>>>      // (MS) I believe this would work without any modifications
>>> elsewhere, but I could be wrong
>>>
>>>      // migrated from ReflectiveCallerClassUtility
>>> +    @PerformanceSensitive
>>>      public static Class<?> getCallerClass(final int depth) {
>>>          if (depth < 0) {
>>>              throw new
>>> IndexOutOfBoundsException(Integer.toString(depth));
>>> @@ -193,11 +194,13 @@ public final class ReflectionUtil {
>>>      }
>>>
>>>      // migrated from ClassLoaderContextSelector
>>> +    @PerformanceSensitive
>>>      public static Class<?> getCallerClass(final String fqcn) {
>>>          return getCallerClass(fqcn, Strings.EMPTY);
>>>      }
>>>
>>>      // migrated from Log4jLoggerFactory
>>> +    @PerformanceSensitive
>>>      public static Class<?> getCallerClass(final String fqcn, final
>>> String pkg) {
>>>          if (supportsFastReflection()) {
>>>              boolean next = false;
>>> @@ -227,6 +230,7 @@ public final class ReflectionUtil {
>>>      }
>>>
>>>      // added for use in LoggerAdapter implementations mainly
>>> +    @PerformanceSensitive
>>>      public static Class<?> getCallerClass(final Class<?> anchor) {
>>>          if (supportsFastReflection()) {
>>>              boolean next = false;
>>> @@ -270,6 +274,7 @@ public final class ReflectionUtil {
>>>      }
>>>
>>>      // migrated from ThrowableProxy
>>> +    @PerformanceSensitive
>>>      public static Stack<Class<?>> getCurrentStackTrace() {
>>>          // benchmarks show that using the SecurityManager is much
>>> faster than looping through getCallerClass(int)
>>>          if (SECURITY_MANAGER != null) {
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>> ----------------------------------------------------------------------
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>> index f65011d..175c9e1 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>> +++
>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>> @@ -25,6 +25,7 @@ import org.apache.logging.log4j.core.LogEvent;
>>>  import org.apache.logging.log4j.core.appender.AppenderLoggingException;
>>>  import org.apache.logging.log4j.core.filter.AbstractFilterable;
>>>  import org.apache.logging.log4j.core.filter.Filterable;
>>> +import org.apache.logging.log4j.util.PerformanceSensitive;
>>>
>>>  /**
>>>   * Wraps an {@link Appender} with details an appender implementation
>>> shouldn't need to know about.
>>> @@ -88,14 +89,17 @@ public class AppenderControl extends
>>> AbstractFilterable {
>>>          return isFilteredByAppenderControl(event) ||
>>> isFilteredByLevel(event) || isRecursiveCall();
>>>      }
>>>
>>> +    @PerformanceSensitive
>>>      private boolean isFilteredByAppenderControl(final LogEvent event) {
>>>          return getFilter() != null && Filter.Result.DENY ==
>>> getFilter().filter(event);
>>>      }
>>>
>>> +    @PerformanceSensitive
>>>      private boolean isFilteredByLevel(final LogEvent event) {
>>>          return level != null && intLevel < event.getLevel().intLevel();
>>>      }
>>>
>>> +    @PerformanceSensitive
>>>      private boolean isRecursiveCall() {
>>>          if (recursive.get() != null) {
>>>              appenderErrorHandlerMessage("Recursive call to appender ");
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>> ----------------------------------------------------------------------
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>> index 78a42b3..d30ce32 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>> +++
>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>> @@ -16,17 +16,19 @@
>>>   */
>>>  package org.apache.logging.log4j.core.config;
>>>
>>> -import org.apache.logging.log4j.core.Appender;
>>> -
>>>  import java.util.Arrays;
>>>  import java.util.HashMap;
>>>  import java.util.Map;
>>>  import java.util.Objects;
>>>  import java.util.concurrent.atomic.AtomicReference;
>>>
>>> +import org.apache.logging.log4j.core.Appender;
>>> +import org.apache.logging.log4j.util.PerformanceSensitive;
>>> +
>>>  /**
>>>   * Data structure with similar semantics to CopyOnWriteArraySet, but
>>> giving direct access to the underlying array.
>>>   */
>>> +@PerformanceSensitive
>>>  public class AppenderControlArraySet {
>>>      private final AtomicReference<AppenderControl[]> appenderArray =
>>> new AtomicReference<>(new AppenderControl[0]);
>>>
>>> @@ -117,4 +119,4 @@ public class AppenderControlArraySet {
>>>      public AppenderControl[] get() {
>>>          return appenderArray.get();
>>>      }
>>> -}
>>> \ No newline at end of file
>>> +}
>>>
>>>
>>>
>>>
>>> --
>>> E-Mail: garydgregory@gmail.com
>>> <javascript:_e(%7B%7D,'cvml','garydgregory@gmail.com');> | ggregory@apache.org
>>> <javascript:_e(%7B%7D,'cvml','ggregory@apache.org');>
>>> Java Persistence with Hibernate, Second Edition
>>> <http://www.manning.com/bauer3/>
>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>> Spring Batch in Action <http://www.manning.com/templier/>
>>> Blog: http://garygregory.wordpress.com
>>> Home: http://garygregory.com/
>>> Tweet! http://twitter.com/GaryGregory
>>>
>>
>>
>>
>> --
>> Matt Sicker <boards@gmail.com
>> <javascript:_e(%7B%7D,'cvml','boards@gmail.com');>>
>>
>
>
>
> --
> E-Mail: garydgregory@gmail.com
> <javascript:_e(%7B%7D,'cvml','garydgregory@gmail.com');> | ggregory@apache.org
> <javascript:_e(%7B%7D,'cvml','ggregory@apache.org');>
> Java Persistence with Hibernate, Second Edition
> <http://www.manning.com/bauer3/>
> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
> Spring Batch in Action <http://www.manning.com/templier/>
> Blog: http://garygregory.wordpress.com
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory
>
>

Re: logging-log4j2 git commit: Add PerformanceSensitive annotation.

Posted by Matt Sicker <bo...@gmail.com>.
Using a generic annotation could work like @SuppressWarnings does.

On 21 February 2016 at 22:19, Remko Popma <re...@gmail.com> wrote:

> I like @PerformanceSensitive very much!
>
> I can then see specific variations like
> @PerformanceSensitive("InlineSize")
> @PerformanceSensitive("AllocationFree")
>
>
>
> Sent from my iPhone
>
> On 2016/02/22, at 12:48, Gary Gregory <ga...@gmail.com> wrote:
>
> Well, a method can be on the critical path and not have been
> hand-optimized either because it is already as fast as can be or we have
> not gotten around to it (which make you want to have a @NeedsOptimization,
> rabbit hole warning!). So we could have both. Some methods would
> be @CriticalPath, and some both @CriticalPath and @HandOptimized. But you
> would not have just @HandOptimized or if you did it would
> imply @CriticalPath. which is a bit too clever ....
>
> Gary
>
> On Sun, Feb 21, 2016 at 7:43 PM, Matt Sicker <bo...@gmail.com> wrote:
>
>> Those both sound better, but I can't decide on which.
>>
>> On 21 February 2016 at 21:32, Gary Gregory <ga...@gmail.com>
>> wrote:
>>
>>> I wonder if @CriticalPath or @HandOptimized would convey better what we
>>> are trying to express?
>>>
>>> Gary
>>>
>>>
>>> ---------- Forwarded message ----------
>>> From: <ma...@apache.org>
>>> Date: Sun, Feb 21, 2016 at 7:02 PM
>>> Subject: logging-log4j2 git commit: Add PerformanceSensitive annotation.
>>> To: commits@logging.apache.org
>>>
>>>
>>> Repository: logging-log4j2
>>> Updated Branches:
>>>   refs/heads/master f884234a8 -> 4aa7df826
>>>
>>>
>>> Add PerformanceSensitive annotation.
>>>
>>>
>>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
>>> Commit:
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/4aa7df82
>>> Tree:
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/4aa7df82
>>> Diff:
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/4aa7df82
>>>
>>> Branch: refs/heads/master
>>> Commit: 4aa7df826de7e359ac3bde98597fe5ca6e4b5901
>>> Parents: f884234
>>> Author: Matt Sicker <bo...@gmail.com>
>>> Authored: Sun Feb 21 21:02:51 2016 -0600
>>> Committer: Matt Sicker <bo...@gmail.com>
>>> Committed: Sun Feb 21 21:02:51 2016 -0600
>>>
>>> ----------------------------------------------------------------------
>>>  .../log4j/util/PerformanceSensitive.java        | 29
>>> ++++++++++++++++++++
>>>  .../logging/log4j/util/ReflectionUtil.java      |  5 ++++
>>>  .../log4j/core/config/AppenderControl.java      |  4 +++
>>>  .../core/config/AppenderControlArraySet.java    |  8 ++++--
>>>  4 files changed, 43 insertions(+), 3 deletions(-)
>>> ----------------------------------------------------------------------
>>>
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>> ----------------------------------------------------------------------
>>> diff --git
>>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>> new file mode 100644
>>> index 0000000..3fbb058
>>> --- /dev/null
>>> +++
>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>> @@ -0,0 +1,29 @@
>>> +/*
>>> + * 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.logging.log4j.util;
>>> +
>>> +/**
>>> + * Indicates that a particular annotated construct was written with
>>> certain performance constraints in mind that
>>> + * should be considered when modifying or testing.
>>> + *
>>> + * @since 2.6
>>> + */
>>> +public @interface PerformanceSensitive {
>>> +    /** Description of why this is written the way it is. */
>>> +    String value() default "";
>>> +}
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>> ----------------------------------------------------------------------
>>> diff --git
>>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>> index 6e7ce4a..dec2350 100644
>>> ---
>>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>> +++
>>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>> @@ -117,6 +117,7 @@ public final class ReflectionUtil {
>>>      // (MS) I believe this would work without any modifications
>>> elsewhere, but I could be wrong
>>>
>>>      // migrated from ReflectiveCallerClassUtility
>>> +    @PerformanceSensitive
>>>      public static Class<?> getCallerClass(final int depth) {
>>>          if (depth < 0) {
>>>              throw new
>>> IndexOutOfBoundsException(Integer.toString(depth));
>>> @@ -193,11 +194,13 @@ public final class ReflectionUtil {
>>>      }
>>>
>>>      // migrated from ClassLoaderContextSelector
>>> +    @PerformanceSensitive
>>>      public static Class<?> getCallerClass(final String fqcn) {
>>>          return getCallerClass(fqcn, Strings.EMPTY);
>>>      }
>>>
>>>      // migrated from Log4jLoggerFactory
>>> +    @PerformanceSensitive
>>>      public static Class<?> getCallerClass(final String fqcn, final
>>> String pkg) {
>>>          if (supportsFastReflection()) {
>>>              boolean next = false;
>>> @@ -227,6 +230,7 @@ public final class ReflectionUtil {
>>>      }
>>>
>>>      // added for use in LoggerAdapter implementations mainly
>>> +    @PerformanceSensitive
>>>      public static Class<?> getCallerClass(final Class<?> anchor) {
>>>          if (supportsFastReflection()) {
>>>              boolean next = false;
>>> @@ -270,6 +274,7 @@ public final class ReflectionUtil {
>>>      }
>>>
>>>      // migrated from ThrowableProxy
>>> +    @PerformanceSensitive
>>>      public static Stack<Class<?>> getCurrentStackTrace() {
>>>          // benchmarks show that using the SecurityManager is much
>>> faster than looping through getCallerClass(int)
>>>          if (SECURITY_MANAGER != null) {
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>> ----------------------------------------------------------------------
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>> index f65011d..175c9e1 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>> +++
>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>> @@ -25,6 +25,7 @@ import org.apache.logging.log4j.core.LogEvent;
>>>  import org.apache.logging.log4j.core.appender.AppenderLoggingException;
>>>  import org.apache.logging.log4j.core.filter.AbstractFilterable;
>>>  import org.apache.logging.log4j.core.filter.Filterable;
>>> +import org.apache.logging.log4j.util.PerformanceSensitive;
>>>
>>>  /**
>>>   * Wraps an {@link Appender} with details an appender implementation
>>> shouldn't need to know about.
>>> @@ -88,14 +89,17 @@ public class AppenderControl extends
>>> AbstractFilterable {
>>>          return isFilteredByAppenderControl(event) ||
>>> isFilteredByLevel(event) || isRecursiveCall();
>>>      }
>>>
>>> +    @PerformanceSensitive
>>>      private boolean isFilteredByAppenderControl(final LogEvent event) {
>>>          return getFilter() != null && Filter.Result.DENY ==
>>> getFilter().filter(event);
>>>      }
>>>
>>> +    @PerformanceSensitive
>>>      private boolean isFilteredByLevel(final LogEvent event) {
>>>          return level != null && intLevel < event.getLevel().intLevel();
>>>      }
>>>
>>> +    @PerformanceSensitive
>>>      private boolean isRecursiveCall() {
>>>          if (recursive.get() != null) {
>>>              appenderErrorHandlerMessage("Recursive call to appender ");
>>>
>>>
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>> ----------------------------------------------------------------------
>>> diff --git
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>> index 78a42b3..d30ce32 100644
>>> ---
>>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>> +++
>>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>> @@ -16,17 +16,19 @@
>>>   */
>>>  package org.apache.logging.log4j.core.config;
>>>
>>> -import org.apache.logging.log4j.core.Appender;
>>> -
>>>  import java.util.Arrays;
>>>  import java.util.HashMap;
>>>  import java.util.Map;
>>>  import java.util.Objects;
>>>  import java.util.concurrent.atomic.AtomicReference;
>>>
>>> +import org.apache.logging.log4j.core.Appender;
>>> +import org.apache.logging.log4j.util.PerformanceSensitive;
>>> +
>>>  /**
>>>   * Data structure with similar semantics to CopyOnWriteArraySet, but
>>> giving direct access to the underlying array.
>>>   */
>>> +@PerformanceSensitive
>>>  public class AppenderControlArraySet {
>>>      private final AtomicReference<AppenderControl[]> appenderArray =
>>> new AtomicReference<>(new AppenderControl[0]);
>>>
>>> @@ -117,4 +119,4 @@ public class AppenderControlArraySet {
>>>      public AppenderControl[] get() {
>>>          return appenderArray.get();
>>>      }
>>> -}
>>> \ No newline at end of file
>>> +}
>>>
>>>
>>>
>>>
>>> --
>>> E-Mail: garydgregory@gmail.com | ggregory@apache.org
>>> Java Persistence with Hibernate, Second Edition
>>> <http://www.manning.com/bauer3/>
>>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>>> Spring Batch in Action <http://www.manning.com/templier/>
>>> Blog: http://garygregory.wordpress.com
>>> Home: http://garygregory.com/
>>> Tweet! http://twitter.com/GaryGregory
>>>
>>
>>
>>
>> --
>> Matt Sicker <bo...@gmail.com>
>>
>
>
>
> --
> E-Mail: garydgregory@gmail.com | ggregory@apache.org
> Java Persistence with Hibernate, Second Edition
> <http://www.manning.com/bauer3/>
> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
> Spring Batch in Action <http://www.manning.com/templier/>
> Blog: http://garygregory.wordpress.com
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory
>
>


-- 
Matt Sicker <bo...@gmail.com>

Re: logging-log4j2 git commit: Add PerformanceSensitive annotation.

Posted by Remko Popma <re...@gmail.com>.
I like @PerformanceSensitive very much!

I can then see specific variations like
@PerformanceSensitive("InlineSize")
@PerformanceSensitive("AllocationFree")



Sent from my iPhone

> On 2016/02/22, at 12:48, Gary Gregory <ga...@gmail.com> wrote:
> 
> Well, a method can be on the critical path and not have been hand-optimized either because it is already as fast as can be or we have not gotten around to it (which make you want to have a @NeedsOptimization, rabbit hole warning!). So we could have both. Some methods would be @CriticalPath, and some both @CriticalPath and @HandOptimized. But you would not have just @HandOptimized or if you did it would imply @CriticalPath. which is a bit too clever ....
> 
> Gary
> 
>> On Sun, Feb 21, 2016 at 7:43 PM, Matt Sicker <bo...@gmail.com> wrote:
>> Those both sound better, but I can't decide on which.
>> 
>>> On 21 February 2016 at 21:32, Gary Gregory <ga...@gmail.com> wrote:
>>> I wonder if @CriticalPath or @HandOptimized would convey better what we are trying to express?
>>> 
>>> Gary
>>> 
>>> 
>>> ---------- Forwarded message ----------
>>> From: <ma...@apache.org>
>>> Date: Sun, Feb 21, 2016 at 7:02 PM
>>> Subject: logging-log4j2 git commit: Add PerformanceSensitive annotation.
>>> To: commits@logging.apache.org
>>> 
>>> 
>>> Repository: logging-log4j2
>>> Updated Branches:
>>>   refs/heads/master f884234a8 -> 4aa7df826
>>> 
>>> 
>>> Add PerformanceSensitive annotation.
>>> 
>>> 
>>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
>>> Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/4aa7df82
>>> Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/4aa7df82
>>> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/4aa7df82
>>> 
>>> Branch: refs/heads/master
>>> Commit: 4aa7df826de7e359ac3bde98597fe5ca6e4b5901
>>> Parents: f884234
>>> Author: Matt Sicker <bo...@gmail.com>
>>> Authored: Sun Feb 21 21:02:51 2016 -0600
>>> Committer: Matt Sicker <bo...@gmail.com>
>>> Committed: Sun Feb 21 21:02:51 2016 -0600
>>> 
>>> ----------------------------------------------------------------------
>>>  .../log4j/util/PerformanceSensitive.java        | 29 ++++++++++++++++++++
>>>  .../logging/log4j/util/ReflectionUtil.java      |  5 ++++
>>>  .../log4j/core/config/AppenderControl.java      |  4 +++
>>>  .../core/config/AppenderControlArraySet.java    |  8 ++++--
>>>  4 files changed, 43 insertions(+), 3 deletions(-)
>>> ----------------------------------------------------------------------
>>> 
>>> 
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>> ----------------------------------------------------------------------
>>> diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>> new file mode 100644
>>> index 0000000..3fbb058
>>> --- /dev/null
>>> +++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>>> @@ -0,0 +1,29 @@
>>> +/*
>>> + * 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.logging.log4j.util;
>>> +
>>> +/**
>>> + * Indicates that a particular annotated construct was written with certain performance constraints in mind that
>>> + * should be considered when modifying or testing.
>>> + *
>>> + * @since 2.6
>>> + */
>>> +public @interface PerformanceSensitive {
>>> +    /** Description of why this is written the way it is. */
>>> +    String value() default "";
>>> +}
>>> 
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>> ----------------------------------------------------------------------
>>> diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>> index 6e7ce4a..dec2350 100644
>>> --- a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>> +++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>>> @@ -117,6 +117,7 @@ public final class ReflectionUtil {
>>>      // (MS) I believe this would work without any modifications elsewhere, but I could be wrong
>>> 
>>>      // migrated from ReflectiveCallerClassUtility
>>> +    @PerformanceSensitive
>>>      public static Class<?> getCallerClass(final int depth) {
>>>          if (depth < 0) {
>>>              throw new IndexOutOfBoundsException(Integer.toString(depth));
>>> @@ -193,11 +194,13 @@ public final class ReflectionUtil {
>>>      }
>>> 
>>>      // migrated from ClassLoaderContextSelector
>>> +    @PerformanceSensitive
>>>      public static Class<?> getCallerClass(final String fqcn) {
>>>          return getCallerClass(fqcn, Strings.EMPTY);
>>>      }
>>> 
>>>      // migrated from Log4jLoggerFactory
>>> +    @PerformanceSensitive
>>>      public static Class<?> getCallerClass(final String fqcn, final String pkg) {
>>>          if (supportsFastReflection()) {
>>>              boolean next = false;
>>> @@ -227,6 +230,7 @@ public final class ReflectionUtil {
>>>      }
>>> 
>>>      // added for use in LoggerAdapter implementations mainly
>>> +    @PerformanceSensitive
>>>      public static Class<?> getCallerClass(final Class<?> anchor) {
>>>          if (supportsFastReflection()) {
>>>              boolean next = false;
>>> @@ -270,6 +274,7 @@ public final class ReflectionUtil {
>>>      }
>>> 
>>>      // migrated from ThrowableProxy
>>> +    @PerformanceSensitive
>>>      public static Stack<Class<?>> getCurrentStackTrace() {
>>>          // benchmarks show that using the SecurityManager is much faster than looping through getCallerClass(int)
>>>          if (SECURITY_MANAGER != null) {
>>> 
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>> ----------------------------------------------------------------------
>>> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>> index f65011d..175c9e1 100644
>>> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>>> @@ -25,6 +25,7 @@ import org.apache.logging.log4j.core.LogEvent;
>>>  import org.apache.logging.log4j.core.appender.AppenderLoggingException;
>>>  import org.apache.logging.log4j.core.filter.AbstractFilterable;
>>>  import org.apache.logging.log4j.core.filter.Filterable;
>>> +import org.apache.logging.log4j.util.PerformanceSensitive;
>>> 
>>>  /**
>>>   * Wraps an {@link Appender} with details an appender implementation shouldn't need to know about.
>>> @@ -88,14 +89,17 @@ public class AppenderControl extends AbstractFilterable {
>>>          return isFilteredByAppenderControl(event) || isFilteredByLevel(event) || isRecursiveCall();
>>>      }
>>> 
>>> +    @PerformanceSensitive
>>>      private boolean isFilteredByAppenderControl(final LogEvent event) {
>>>          return getFilter() != null && Filter.Result.DENY == getFilter().filter(event);
>>>      }
>>> 
>>> +    @PerformanceSensitive
>>>      private boolean isFilteredByLevel(final LogEvent event) {
>>>          return level != null && intLevel < event.getLevel().intLevel();
>>>      }
>>> 
>>> +    @PerformanceSensitive
>>>      private boolean isRecursiveCall() {
>>>          if (recursive.get() != null) {
>>>              appenderErrorHandlerMessage("Recursive call to appender ");
>>> 
>>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>> ----------------------------------------------------------------------
>>> diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>> index 78a42b3..d30ce32 100644
>>> --- a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>> +++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>>> @@ -16,17 +16,19 @@
>>>   */
>>>  package org.apache.logging.log4j.core.config;
>>> 
>>> -import org.apache.logging.log4j.core.Appender;
>>> -
>>>  import java.util.Arrays;
>>>  import java.util.HashMap;
>>>  import java.util.Map;
>>>  import java.util.Objects;
>>>  import java.util.concurrent.atomic.AtomicReference;
>>> 
>>> +import org.apache.logging.log4j.core.Appender;
>>> +import org.apache.logging.log4j.util.PerformanceSensitive;
>>> +
>>>  /**
>>>   * Data structure with similar semantics to CopyOnWriteArraySet, but giving direct access to the underlying array.
>>>   */
>>> +@PerformanceSensitive
>>>  public class AppenderControlArraySet {
>>>      private final AtomicReference<AppenderControl[]> appenderArray = new AtomicReference<>(new AppenderControl[0]);
>>> 
>>> @@ -117,4 +119,4 @@ public class AppenderControlArraySet {
>>>      public AppenderControl[] get() {
>>>          return appenderArray.get();
>>>      }
>>> -}
>>> \ No newline at end of file
>>> +}
>>> 
>>> 
>>> 
>>> 
>>> -- 
>>> E-Mail: garydgregory@gmail.com | ggregory@apache.org 
>>> Java Persistence with Hibernate, Second Edition
>>> JUnit in Action, Second Edition
>>> Spring Batch in Action
>>> Blog: http://garygregory.wordpress.com 
>>> Home: http://garygregory.com/
>>> Tweet! http://twitter.com/GaryGregory
>> 
>> 
>> 
>> -- 
>> Matt Sicker <bo...@gmail.com>
> 
> 
> 
> -- 
> E-Mail: garydgregory@gmail.com | ggregory@apache.org 
> Java Persistence with Hibernate, Second Edition
> JUnit in Action, Second Edition
> Spring Batch in Action
> Blog: http://garygregory.wordpress.com 
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory

Re: logging-log4j2 git commit: Add PerformanceSensitive annotation.

Posted by Gary Gregory <ga...@gmail.com>.
Well, a method can be on the critical path and not have been hand-optimized
either because it is already as fast as can be or we have not gotten around
to it (which make you want to have a @NeedsOptimization, rabbit hole
warning!). So we could have both. Some methods would be @CriticalPath, and
some both @CriticalPath and @HandOptimized. But you would not have just
@HandOptimized or if you did it would imply @CriticalPath. which is a bit
too clever ....

Gary

On Sun, Feb 21, 2016 at 7:43 PM, Matt Sicker <bo...@gmail.com> wrote:

> Those both sound better, but I can't decide on which.
>
> On 21 February 2016 at 21:32, Gary Gregory <ga...@gmail.com> wrote:
>
>> I wonder if @CriticalPath or @HandOptimized would convey better what we
>> are trying to express?
>>
>> Gary
>>
>>
>> ---------- Forwarded message ----------
>> From: <ma...@apache.org>
>> Date: Sun, Feb 21, 2016 at 7:02 PM
>> Subject: logging-log4j2 git commit: Add PerformanceSensitive annotation.
>> To: commits@logging.apache.org
>>
>>
>> Repository: logging-log4j2
>> Updated Branches:
>>   refs/heads/master f884234a8 -> 4aa7df826
>>
>>
>> Add PerformanceSensitive annotation.
>>
>>
>> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
>> Commit:
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/4aa7df82
>> Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/4aa7df82
>> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/4aa7df82
>>
>> Branch: refs/heads/master
>> Commit: 4aa7df826de7e359ac3bde98597fe5ca6e4b5901
>> Parents: f884234
>> Author: Matt Sicker <bo...@gmail.com>
>> Authored: Sun Feb 21 21:02:51 2016 -0600
>> Committer: Matt Sicker <bo...@gmail.com>
>> Committed: Sun Feb 21 21:02:51 2016 -0600
>>
>> ----------------------------------------------------------------------
>>  .../log4j/util/PerformanceSensitive.java        | 29 ++++++++++++++++++++
>>  .../logging/log4j/util/ReflectionUtil.java      |  5 ++++
>>  .../log4j/core/config/AppenderControl.java      |  4 +++
>>  .../core/config/AppenderControlArraySet.java    |  8 ++++--
>>  4 files changed, 43 insertions(+), 3 deletions(-)
>> ----------------------------------------------------------------------
>>
>>
>>
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>> ----------------------------------------------------------------------
>> diff --git
>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>> new file mode 100644
>> index 0000000..3fbb058
>> --- /dev/null
>> +++
>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
>> @@ -0,0 +1,29 @@
>> +/*
>> + * 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.logging.log4j.util;
>> +
>> +/**
>> + * Indicates that a particular annotated construct was written with
>> certain performance constraints in mind that
>> + * should be considered when modifying or testing.
>> + *
>> + * @since 2.6
>> + */
>> +public @interface PerformanceSensitive {
>> +    /** Description of why this is written the way it is. */
>> +    String value() default "";
>> +}
>>
>>
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>> ----------------------------------------------------------------------
>> diff --git
>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>> index 6e7ce4a..dec2350 100644
>> ---
>> a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>> +++
>> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
>> @@ -117,6 +117,7 @@ public final class ReflectionUtil {
>>      // (MS) I believe this would work without any modifications
>> elsewhere, but I could be wrong
>>
>>      // migrated from ReflectiveCallerClassUtility
>> +    @PerformanceSensitive
>>      public static Class<?> getCallerClass(final int depth) {
>>          if (depth < 0) {
>>              throw new IndexOutOfBoundsException(Integer.toString(depth));
>> @@ -193,11 +194,13 @@ public final class ReflectionUtil {
>>      }
>>
>>      // migrated from ClassLoaderContextSelector
>> +    @PerformanceSensitive
>>      public static Class<?> getCallerClass(final String fqcn) {
>>          return getCallerClass(fqcn, Strings.EMPTY);
>>      }
>>
>>      // migrated from Log4jLoggerFactory
>> +    @PerformanceSensitive
>>      public static Class<?> getCallerClass(final String fqcn, final
>> String pkg) {
>>          if (supportsFastReflection()) {
>>              boolean next = false;
>> @@ -227,6 +230,7 @@ public final class ReflectionUtil {
>>      }
>>
>>      // added for use in LoggerAdapter implementations mainly
>> +    @PerformanceSensitive
>>      public static Class<?> getCallerClass(final Class<?> anchor) {
>>          if (supportsFastReflection()) {
>>              boolean next = false;
>> @@ -270,6 +274,7 @@ public final class ReflectionUtil {
>>      }
>>
>>      // migrated from ThrowableProxy
>> +    @PerformanceSensitive
>>      public static Stack<Class<?>> getCurrentStackTrace() {
>>          // benchmarks show that using the SecurityManager is much faster
>> than looping through getCallerClass(int)
>>          if (SECURITY_MANAGER != null) {
>>
>>
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>> ----------------------------------------------------------------------
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>> index f65011d..175c9e1 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>> +++
>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
>> @@ -25,6 +25,7 @@ import org.apache.logging.log4j.core.LogEvent;
>>  import org.apache.logging.log4j.core.appender.AppenderLoggingException;
>>  import org.apache.logging.log4j.core.filter.AbstractFilterable;
>>  import org.apache.logging.log4j.core.filter.Filterable;
>> +import org.apache.logging.log4j.util.PerformanceSensitive;
>>
>>  /**
>>   * Wraps an {@link Appender} with details an appender implementation
>> shouldn't need to know about.
>> @@ -88,14 +89,17 @@ public class AppenderControl extends
>> AbstractFilterable {
>>          return isFilteredByAppenderControl(event) ||
>> isFilteredByLevel(event) || isRecursiveCall();
>>      }
>>
>> +    @PerformanceSensitive
>>      private boolean isFilteredByAppenderControl(final LogEvent event) {
>>          return getFilter() != null && Filter.Result.DENY ==
>> getFilter().filter(event);
>>      }
>>
>> +    @PerformanceSensitive
>>      private boolean isFilteredByLevel(final LogEvent event) {
>>          return level != null && intLevel < event.getLevel().intLevel();
>>      }
>>
>> +    @PerformanceSensitive
>>      private boolean isRecursiveCall() {
>>          if (recursive.get() != null) {
>>              appenderErrorHandlerMessage("Recursive call to appender ");
>>
>>
>> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>> ----------------------------------------------------------------------
>> diff --git
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>> index 78a42b3..d30ce32 100644
>> ---
>> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>> +++
>> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
>> @@ -16,17 +16,19 @@
>>   */
>>  package org.apache.logging.log4j.core.config;
>>
>> -import org.apache.logging.log4j.core.Appender;
>> -
>>  import java.util.Arrays;
>>  import java.util.HashMap;
>>  import java.util.Map;
>>  import java.util.Objects;
>>  import java.util.concurrent.atomic.AtomicReference;
>>
>> +import org.apache.logging.log4j.core.Appender;
>> +import org.apache.logging.log4j.util.PerformanceSensitive;
>> +
>>  /**
>>   * Data structure with similar semantics to CopyOnWriteArraySet, but
>> giving direct access to the underlying array.
>>   */
>> +@PerformanceSensitive
>>  public class AppenderControlArraySet {
>>      private final AtomicReference<AppenderControl[]> appenderArray = new
>> AtomicReference<>(new AppenderControl[0]);
>>
>> @@ -117,4 +119,4 @@ public class AppenderControlArraySet {
>>      public AppenderControl[] get() {
>>          return appenderArray.get();
>>      }
>> -}
>> \ No newline at end of file
>> +}
>>
>>
>>
>>
>> --
>> E-Mail: garydgregory@gmail.com | ggregory@apache.org
>> Java Persistence with Hibernate, Second Edition
>> <http://www.manning.com/bauer3/>
>> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
>> Spring Batch in Action <http://www.manning.com/templier/>
>> Blog: http://garygregory.wordpress.com
>> Home: http://garygregory.com/
>> Tweet! http://twitter.com/GaryGregory
>>
>
>
>
> --
> Matt Sicker <bo...@gmail.com>
>



-- 
E-Mail: garydgregory@gmail.com | ggregory@apache.org
Java Persistence with Hibernate, Second Edition
<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
Spring Batch in Action <http://www.manning.com/templier/>
Blog: http://garygregory.wordpress.com
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory

Re: logging-log4j2 git commit: Add PerformanceSensitive annotation.

Posted by Matt Sicker <bo...@gmail.com>.
Those both sound better, but I can't decide on which.

On 21 February 2016 at 21:32, Gary Gregory <ga...@gmail.com> wrote:

> I wonder if @CriticalPath or @HandOptimized would convey better what we
> are trying to express?
>
> Gary
>
>
> ---------- Forwarded message ----------
> From: <ma...@apache.org>
> Date: Sun, Feb 21, 2016 at 7:02 PM
> Subject: logging-log4j2 git commit: Add PerformanceSensitive annotation.
> To: commits@logging.apache.org
>
>
> Repository: logging-log4j2
> Updated Branches:
>   refs/heads/master f884234a8 -> 4aa7df826
>
>
> Add PerformanceSensitive annotation.
>
>
> Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
> Commit:
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/4aa7df82
> Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/4aa7df82
> Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/4aa7df82
>
> Branch: refs/heads/master
> Commit: 4aa7df826de7e359ac3bde98597fe5ca6e4b5901
> Parents: f884234
> Author: Matt Sicker <bo...@gmail.com>
> Authored: Sun Feb 21 21:02:51 2016 -0600
> Committer: Matt Sicker <bo...@gmail.com>
> Committed: Sun Feb 21 21:02:51 2016 -0600
>
> ----------------------------------------------------------------------
>  .../log4j/util/PerformanceSensitive.java        | 29 ++++++++++++++++++++
>  .../logging/log4j/util/ReflectionUtil.java      |  5 ++++
>  .../log4j/core/config/AppenderControl.java      |  4 +++
>  .../core/config/AppenderControlArraySet.java    |  8 ++++--
>  4 files changed, 43 insertions(+), 3 deletions(-)
> ----------------------------------------------------------------------
>
>
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
> ----------------------------------------------------------------------
> diff --git
> a/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
> b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
> new file mode 100644
> index 0000000..3fbb058
> --- /dev/null
> +++
> b/log4j-api/src/main/java/org/apache/logging/log4j/util/PerformanceSensitive.java
> @@ -0,0 +1,29 @@
> +/*
> + * 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.logging.log4j.util;
> +
> +/**
> + * Indicates that a particular annotated construct was written with
> certain performance constraints in mind that
> + * should be considered when modifying or testing.
> + *
> + * @since 2.6
> + */
> +public @interface PerformanceSensitive {
> +    /** Description of why this is written the way it is. */
> +    String value() default "";
> +}
>
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
> ----------------------------------------------------------------------
> diff --git
> a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
> index 6e7ce4a..dec2350 100644
> ---
> a/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
> +++
> b/log4j-api/src/main/java/org/apache/logging/log4j/util/ReflectionUtil.java
> @@ -117,6 +117,7 @@ public final class ReflectionUtil {
>      // (MS) I believe this would work without any modifications
> elsewhere, but I could be wrong
>
>      // migrated from ReflectiveCallerClassUtility
> +    @PerformanceSensitive
>      public static Class<?> getCallerClass(final int depth) {
>          if (depth < 0) {
>              throw new IndexOutOfBoundsException(Integer.toString(depth));
> @@ -193,11 +194,13 @@ public final class ReflectionUtil {
>      }
>
>      // migrated from ClassLoaderContextSelector
> +    @PerformanceSensitive
>      public static Class<?> getCallerClass(final String fqcn) {
>          return getCallerClass(fqcn, Strings.EMPTY);
>      }
>
>      // migrated from Log4jLoggerFactory
> +    @PerformanceSensitive
>      public static Class<?> getCallerClass(final String fqcn, final String
> pkg) {
>          if (supportsFastReflection()) {
>              boolean next = false;
> @@ -227,6 +230,7 @@ public final class ReflectionUtil {
>      }
>
>      // added for use in LoggerAdapter implementations mainly
> +    @PerformanceSensitive
>      public static Class<?> getCallerClass(final Class<?> anchor) {
>          if (supportsFastReflection()) {
>              boolean next = false;
> @@ -270,6 +274,7 @@ public final class ReflectionUtil {
>      }
>
>      // migrated from ThrowableProxy
> +    @PerformanceSensitive
>      public static Stack<Class<?>> getCurrentStackTrace() {
>          // benchmarks show that using the SecurityManager is much faster
> than looping through getCallerClass(int)
>          if (SECURITY_MANAGER != null) {
>
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
> ----------------------------------------------------------------------
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
> index f65011d..175c9e1 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
> +++
> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControl.java
> @@ -25,6 +25,7 @@ import org.apache.logging.log4j.core.LogEvent;
>  import org.apache.logging.log4j.core.appender.AppenderLoggingException;
>  import org.apache.logging.log4j.core.filter.AbstractFilterable;
>  import org.apache.logging.log4j.core.filter.Filterable;
> +import org.apache.logging.log4j.util.PerformanceSensitive;
>
>  /**
>   * Wraps an {@link Appender} with details an appender implementation
> shouldn't need to know about.
> @@ -88,14 +89,17 @@ public class AppenderControl extends
> AbstractFilterable {
>          return isFilteredByAppenderControl(event) ||
> isFilteredByLevel(event) || isRecursiveCall();
>      }
>
> +    @PerformanceSensitive
>      private boolean isFilteredByAppenderControl(final LogEvent event) {
>          return getFilter() != null && Filter.Result.DENY ==
> getFilter().filter(event);
>      }
>
> +    @PerformanceSensitive
>      private boolean isFilteredByLevel(final LogEvent event) {
>          return level != null && intLevel < event.getLevel().intLevel();
>      }
>
> +    @PerformanceSensitive
>      private boolean isRecursiveCall() {
>          if (recursive.get() != null) {
>              appenderErrorHandlerMessage("Recursive call to appender ");
>
>
> http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/4aa7df82/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
> ----------------------------------------------------------------------
> diff --git
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
> index 78a42b3..d30ce32 100644
> ---
> a/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
> +++
> b/log4j-core/src/main/java/org/apache/logging/log4j/core/config/AppenderControlArraySet.java
> @@ -16,17 +16,19 @@
>   */
>  package org.apache.logging.log4j.core.config;
>
> -import org.apache.logging.log4j.core.Appender;
> -
>  import java.util.Arrays;
>  import java.util.HashMap;
>  import java.util.Map;
>  import java.util.Objects;
>  import java.util.concurrent.atomic.AtomicReference;
>
> +import org.apache.logging.log4j.core.Appender;
> +import org.apache.logging.log4j.util.PerformanceSensitive;
> +
>  /**
>   * Data structure with similar semantics to CopyOnWriteArraySet, but
> giving direct access to the underlying array.
>   */
> +@PerformanceSensitive
>  public class AppenderControlArraySet {
>      private final AtomicReference<AppenderControl[]> appenderArray = new
> AtomicReference<>(new AppenderControl[0]);
>
> @@ -117,4 +119,4 @@ public class AppenderControlArraySet {
>      public AppenderControl[] get() {
>          return appenderArray.get();
>      }
> -}
> \ No newline at end of file
> +}
>
>
>
>
> --
> E-Mail: garydgregory@gmail.com | ggregory@apache.org
> Java Persistence with Hibernate, Second Edition
> <http://www.manning.com/bauer3/>
> JUnit in Action, Second Edition <http://www.manning.com/tahchiev/>
> Spring Batch in Action <http://www.manning.com/templier/>
> Blog: http://garygregory.wordpress.com
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory
>



-- 
Matt Sicker <bo...@gmail.com>