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 <[email protected]> wrote: > > Syntax-wise, you can use either @PerformanceSensitive("foo") or > @PerformanceSensitive({"foo", "bar"}) > > On 21 February 2016 at 22:23, Matt Sicker <[email protected] > <mailto:[email protected]>> 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 <[email protected] > <mailto:[email protected]>> 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 <[email protected] > <mailto:[email protected]>> 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 <[email protected] <>> 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 <[email protected] <>> wrote: >> Those both sound better, but I can't decide on which. >> >> On 21 February 2016 at 21:32, Gary Gregory <[email protected] <>> wrote: >> I wonder if @CriticalPath or @HandOptimized would convey better what we are >> trying to express? >> >> Gary >> >> >> ---------- Forwarded message ---------- >> From: <[email protected] <>> >> Date: Sun, Feb 21, 2016 at 7:02 PM >> Subject: logging-log4j2 git commit: Add PerformanceSensitive annotation. >> To: [email protected] <> >> >> >> 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 <[email protected] <>> >> Authored: Sun Feb 21 21:02:51 2016 -0600 >> Committer: Matt Sicker <[email protected] <>> >> 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: [email protected] <> | [email protected] <> >> 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 <[email protected] <>> >> >> >> >> -- >> E-Mail: [email protected] <> | [email protected] <> >> 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 <[email protected] <mailto:[email protected]>> > > > > -- > Matt Sicker <[email protected] <mailto:[email protected]>>
