The example you provide is fast because it does not do any object
allocation.  Please don't take my word for it - download (or better
yet, build one yourself) a "fastdebug" build from openjdk.org and look
at the opto-assembly that gets generated when you pass the
"-XX:+PrintOptoAssembly" switch.

Benchmarking JIT's is a fascinating topic but beyond the scope of this
list.  Furthermore, anything I say applies only to the Hotspot JVM.

On Thu, Mar 22, 2012 at 8:18 PM, Marco Schulze
<marco.c.schulze at gmail.com> wrote:
>
> I already have all but log rotation and async ready, and haven't yet found a 
> single benchmark supporting the use of a branch as the performance holy 
> grail. For example (outputting to /dev/null):
>
> public static void main (String[] args) {
> ??? ??? for (int i = 0; i < 1000000; i++) {
> ??? ?? ? ?? ??? Log.fatal (Log.class, Log.class, "akd\n\n", i, '\n', out, ' 
> ');
> ?? ? ?? ??? ??? Log.trace (Log.class, Log.class, "akd\n\n", i, '\n', out, ' 
> ');
> ? ?? ?? }
> }
>
> Every call means, minimally, varargs boxing, another call (since fatal() and 
> trace() are simple convenience methods) and an isLoggable() check composed by 
> a ConcurrentHashMap lookup against the class name and (possibly) a 
> synchronized read on the global threshold. trace() is filtered but fatal() is 
> not.
>
> This snipped ran in an average 6.482 seconds. If the call to trace() is 
> commented out (thus removing the filtering overhead), the average falls to 
> 6.366 seconds. Disabling JIT, the figures became 1:37.952 and 1:35.880, 
> respectively. Over a million calls, checking costs only a few milliseconds.
>
> To be sure, this is a fairly simple example: it all runs on a single thread, 
> the hash table is empty and the pressure on the GC is low. Still, differences 
> are very small. Plus, there's no overhead due to a dedicated logging thread.
>
>
> On 22-03-2012 18:59, Zlatin Balevsky wrote:
>
> Double-digit millisecond pauses are not nothing.? They may be acceptable 
> right now but unless you can offer a drastically cleaner syntax Fred should 
> stick with predicates as they are handled much better by the hotspot jit.
>
> On Mar 22, 2012 5:36 PM, "Ximin Luo" <infinity0 at gmx.com> wrote:
>>
>> Lazy evaluation is trivial.
>>
>> Log.info("{1} did {2}",
>> ?new Object(){ public String toString() { return ITEM_1; } },
>> ?new Object(){ public String toString() { return ITEM_2; } }
>> );
>>
>> Garbage collection with short-lived objects costs next to nothing.
>>
>> On 22/03/12 21:15, Zlatin Balevsky wrote:
>> > Constructing the logging strings is half of the problem. ?The amount of 
>> > garbage
>> > they will generate will result in significantly more time in garbage 
>> > collection
>> > pauses.
>> >
>> > Unless you figure out a way to mimic lazy evaluation you have to live with 
>> > the
>> > isLoggable predicates. ?varargs are not an option either because they also
>> > create garbage.
>> >
>> > On Mar 22, 2012 8:11 AM, "Marco Schulze" <marco.c.schulze at gmail.com
>> > <mailto:marco.c.schulze at gmail.com>> wrote:
>> >
>> >
>> >
>> > ? ? On 22-03-2012 08:50, Matthew Toseland wrote:
>> >
>> > ? ? ? ? On Wednesday 21 Mar 2012 21:18:37 Marco Schulze wrote:
>> >
>> > ? ? ? ? ? ? There are basically two big concerns regarding logging in fred:
>> >
>> > ? ? ? ? ? ? - Readability and code clutter, which was my original 
>> > questioning;
>> > ? ? ? ? ? ? - Raw throughput, as raised by toad.
>> >
>> > ? ? ? ? ? ? Point 1 could mostly be solved by removing any traces of 
>> > logMINOR and
>> > ? ? ? ? ? ? logDEBUG on all but the few places where generating messages 
>> > to be
>> > ? ? ? ? ? ? logged brings noticeable slowdown. That'd be enough, but, 
>> > personally,
>> > ? ? ? ? ? ? the mess that the logging backend is does warrant a 
>> > replacement.
>> > ? ? ? ? ? ? According to toad, the current system needs log{MINOR,DEBUG} to
>> > ? ? ? ? ? ? function
>> > ? ? ? ? ? ? in a timely manner. Based on this, I think we all agree a
>> > ? ? ? ? ? ? replacement is
>> > ? ? ? ? ? ? desirable.
>> >
>> > ? ? ? ? ? ? Logging has a few additional requirements:
>> >
>> > ? ? ? ? ? ? - Log rotation (possibly live);
>> > ? ? ? ? ? ? - Reentrant;
>> > ? ? ? ? ? ? - Per-class filtering;
>> > ? ? ? ? ? ? - Specific information in log (class-name, for example).
>> >
>> > ? ? ? ? ? ? Now, _any_ library which fits would make me happy, as long as 
>> > they
>> > ? ? ? ? ? ? agree
>> > ? ? ? ? ? ? to two points:
>> >
>> > ? ? ? ? ? ? - Either lightweight or with optional features. Else, it would 
>> > only
>> > ? ? ? ? ? ? transfer bloat to freenet-ext.jar. For example: log2socket, 
>> > config
>> > ? ? ? ? ? ? management and multiple logging instances;
>> > ? ? ? ? ? ? - Implementable in a few LoC. Specially, it shouldn't need 
>> > specialized
>> > ? ? ? ? ? ? Formatter and Writer.
>> >
>> > ? ? ? ? ? ? Plus, it should be fast.
>> >
>> > ? ? ? ? ? ? ?From the quick research I made (yep, too many lists):
>> >
>> > ? ? ? ? ? ? - SLF4J already fails on point one: it is simply a wrapper;
>> > ? ? ? ? ? ? - The Java logging API fails on point two: specialized classes 
>> > would
>> > ? ? ? ? ? ? have to be written to deal with log rotation, per-class 
>> > filtering and
>> > ? ? ? ? ? ? formatting, plus a wrapper for Logger.{info,warning,...}() 
>> > methods.
>> > ? ? ? ? ? ? Exactly the same as a custom logger, with one more dependency 
>> > and using
>> > ? ? ? ? ? ? more LoC;
>> >
>> > ? ? ? ? No dependancies, it's part of the JDK, isn't it?
>> >
>> > ? ? More classes need to be loaded at startup. It's just me thinking too 
>> > much.
>> >
>> >
>> > ? ? ? ? However, if it's not a clearer/simpler API, it probably doesn't 
>> > make
>> > ? ? ? ? much sense.
>> >
>> > ? ? ? ? ? ? - Log4J seems to fail on point one - it only lacks a button 
>> > that brings
>> > ? ? ? ? ? ? back the dead. It seems interesting, and I haven't dropped 
>> > this yet.
>> >
>> > ? ? ? ? ? ? In either case (custom or external), log* would be banished. 
>> > Forever.
>> >
>> > ? ? ? ? I don't follow. You object to using a separate logs folder?
>> >
>> > ? ? log* == log{MINOR,DEBUG}, not the logs folder.
>> > ? ? _________________________________________________
>> > ? ? Devl mailing list
>> > ? ? Devl at freenetproject.org <mailto:Devl at freenetproject.org>
>> > ? ? https://emu.freenetproject.__org/cgi-bin/mailman/listinfo/__devl
>> > ? ? <https://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl>
>> >
>> >
>> >
>> > _______________________________________________
>> > Devl mailing list
>> > Devl at freenetproject.org
>> > https://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl
>>
>>
>> --
>> GPG: 4096R/5FBBDBCE
>> https://github.com/infinity0
>> https://bitbucket.org/infinity0
>> https://launchpad.net/~infinity0
>>
>>
>> _______________________________________________
>> Devl mailing list
>> Devl at freenetproject.org
>> https://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl
>
>
>
> _______________________________________________
> Devl mailing list
> Devl at freenetproject.org
> https://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl
>
>
> _______________________________________________
> Devl mailing list
> Devl at freenetproject.org
> https://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl

Reply via email to