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]> 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]
> <javascript:_e(%7B%7D,'cvml','[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]
> <javascript:_e(%7B%7D,'cvml','[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]
>> <javascript:_e(%7B%7D,'cvml','[email protected]');>> wrote:
>>
>>> I wonder if @CriticalPath or @HandOptimized would convey better what we
>>> are trying to express?
>>>
>>> Gary
>>>
>>>
>>> ---------- Forwarded message ----------
>>> From: <[email protected]
>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>>
>>> Date: Sun, Feb 21, 2016 at 7:02 PM
>>> Subject: logging-log4j2 git commit: Add PerformanceSensitive annotation.
>>> To: [email protected]
>>> <javascript:_e(%7B%7D,'cvml','[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
>>> 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 <[email protected]
>>> <javascript:_e(%7B%7D,'cvml','[email protected]');>>
>>> Authored: Sun Feb 21 21:02:51 2016 -0600
>>> Committer: Matt Sicker <[email protected]
>>> <javascript:_e(%7B%7D,'cvml','[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
>>> ----------------------------------------------------------------------
>>> 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: [email protected]
>>> <javascript:_e(%7B%7D,'cvml','[email protected]');> | 
>>> [email protected]
>>> <javascript:_e(%7B%7D,'cvml','[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
>>> Home: http://garygregory.com/
>>> Tweet! http://twitter.com/GaryGregory
>>>
>>
>>
>>
>> --
>> Matt Sicker <[email protected]
>> <javascript:_e(%7B%7D,'cvml','[email protected]');>>
>>
>
>
>
> --
> E-Mail: [email protected]
> <javascript:_e(%7B%7D,'cvml','[email protected]');> | [email protected]
> <javascript:_e(%7B%7D,'cvml','[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
> Home: http://garygregory.com/
> Tweet! http://twitter.com/GaryGregory
>
>

Reply via email to