On Friday 23 Mar 2012 16:00:15 Marco Schulze wrote:
> Yes, and yes.
> 
> On 23-03-2012 12:43, Matthew Toseland wrote:
> > On Friday 23 Mar 2012 15:29:44 you wrote:
> >> Right now, the map is only used to list class thresholds which are
> >> different from the global threshold, which means it is empty 99% of the
> >> time. This is the simplest solution, but it also means that the
> >> possibility of lock contention is way higher. However, unless this
> >> proves to be very bad in a real run, I'll stick with it.
> > Sounds like you need to use a volatile.
> >
> > Also your design implies that the log level details will be changed to not 
> > support wildcards/prefixes?

Is there any way to avoid this? Prefixes are really handy in some debugging 
situations. Possibly we could hook into the classloader and apply the wildcards 
on loading?

> >> On 23-03-2012 10:39, Matthew Toseland wrote:
> >>> On Friday 23 Mar 2012 00:18:02 Marco Schulze 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.
> >>> Don't do a synchronized read on the global threshold. Don't do 
> >>> synchronized anything. Just recompute all the classes when the thresholds 
> >>> change.
> >>>
> >>> However, you still haven't told me how you're going to ensure all classes 
> >>> are paged in when you do set all the thresholds in the map?
> >>>> 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"<infini...@gmx.com
> >>>>> <mailto:infini...@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.schu...@gmail.com<mailto:marco.c.schu...@gmail.com>
> >>>>>       >   <mailto:marco.c.schu...@gmail.com
> >>>>>       <mailto:marco.c.schu...@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.
> >>
> 
> 

Attachment: signature.asc
Description: This is a digitally signed message part.

_______________________________________________
Devl mailing list
Devl@freenetproject.org
https://emu.freenetproject.org/cgi-bin/mailman/listinfo/devl

Reply via email to