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>