No one is benchmarking JRE's JIT. If you look closer, there are figures with the average runtime without JIT, exactly to avoid overspecialization.
With JIT, there is a reduction of 0.02% in runtime. Without JIT, this becomes 0.06%. Negligible to all but the few people who do everything in assembly. I am more worried with possible lock contention. On 22-03-2012 23:30, Zlatin Balevsky wrote: > 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 > _______________________________________________ > Devl mailing list > Devl at freenetproject.org > https://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl