[infinispan-dev] trace vs log.isTraceEnabled

Bela Ban bban at redhat.com
Wed Dec 7 06:19:45 EST 2011


If you use a constant, this is not an issue, but what about:

String constant="Error message bla bla";
for(int i=1; i <=10; i++) {
    log.trace(constant + "-" + i);
}

?

On 12/7/11 12:16 PM, Dan Berindei wrote:
> Manik, I believe the constants are interned the moment the class is loaded,
> so there's no extra work to pass int to the trace method.
>   În data de 07.12.2011 12:43, "Manik Surtani"<manik at jboss.org>  a scris:
>
>> Bringing this thread up again, is it really true to say that
>>
>>    if (trace) log.trace("blah")
>>
>> is as cheap as
>>
>>   log.trace("blah")
>>
>> ?
>>
>> In the former, with tracing disabled, nothing happens after the condition
>> check.  In the latter, you still construct a String "blah", and even if
>> there is no complex interpolation or message construction, the basic String
>> message is still constructed (and starts to take up PermGen space too, as
>> literals are interned [1]).
>>
>> So the case for the if (trace) pattern still stands IMO.
>>
>> Cheers
>> Manik
>>
>> [1]
>> http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#intern()
>> "All literal strings and string-valued constant expressions are interned."
>>
>> On 28 Sep 2011, at 17:41, David M. Lloyd wrote:
>>
>>> On 09/28/2011 11:35 AM, Mircea Markus wrote:
>>>> Hi,
>>>>
>>>> I'm not aware of any convention on using trace vs log.isTraceEnabled()
>> to guard the trace statements.
>>>>
>>>> if (trace) log.trace("some request related stuff")
>>>> vs
>>>> if (log.isTraceEnabled()) log.trace("some request related stuff");
>>>>
>>>> The former is more efficient, but cannot be managed at runtime. It
>> seems to be the preferred form, so shall we stick with it?
>>>
>>> If you're using the jboss-logging API, and your log statement does not
>>> do any interpolation, then it is just as fast to do any of the following
>>> (with no if):
>>>
>>>     log.trace("blah");
>>>     log.tracef("the %s happened to %s", foo, bar);
>>>     log.tracev("the {0} happened to {1}", foo, bar);
>>>
>>> In the case where trace logging is disabled, these are exactly as
>>> efficient as the if (log.isTraceEnabled()) variants.  In the case where
>>> it is enabled, it is marginally more efficient (though the trace log
>>> itself is substantially more expensive of course).
>>>
>>> Overall I'd avoid the "if" forms unless you're doing complex
>> interpolation:
>>>
>>>     log.trace("Foo " + bar + " baz " + zap);
>>>     log.tracef("the %s happened to %s", fooMethod().barMethod(), bar);
>>>
>>> ...both of which incur the expense of the expression resolution even if
>>> the log message is ultimately discarded.
>>> --
>>> - DML
>>> _______________________________________________
>>> infinispan-dev mailing list
>>> infinispan-dev at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/infinispan-dev
>>
>> --
>> Manik Surtani
>> manik at jboss.org
>> twitter.com/maniksurtani
>>
>> Lead, Infinispan
>> http://www.infinispan.org
>>
>>
>>
>>
>> _______________________________________________
>> infinispan-dev mailing list
>> infinispan-dev at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/infinispan-dev
>>
>
>
>
> _______________________________________________
> infinispan-dev mailing list
> infinispan-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/infinispan-dev

-- 
Bela Ban
Lead JGroups (http://www.jgroups.org)
JBoss / Red Hat


More information about the infinispan-dev mailing list