Which suggestion? The one about using the provided Class's ClassLoader in LogManager?
On 3 August 2014 02:48, Ralph Goers <ralph.go...@dslextreme.com> wrote: > Yes, ClassLoaderContextSelector isn’t terribly fast. To be honest I made > it the default because I wanted to get feedback on how well it worked or if > it caused issues. I have been pleasantly surprised that there really > haven’t been any serious issues reported on it. > > Over the life of an application though you would only expect thousands of > unique Loggers at the most, so the creation time over the lifetime of the > application probably doesn’t matter much. However, if the application > creates Loggers when classes are created and a lot of them are created at > startup then this could impact startup time significantly. For that reason > I would encourage finding a way to do what Matt is suggesting. I had > actually thought of it myself but just never got around to it. > > Ralph > > On Aug 2, 2014, at 8:05 PM, Remko Popma <remko.po...@gmail.com> wrote: > > Thanks for bringing it up here first. > > I have a question: is this beneficial for envs like OSGi and web apps, or > are you aiming for a general speedup? > Generally I try to optimize the heck out of things that are called all the > time, but usually don't bother with code that is run only once. That said, > if we can cut the startup time in half or so that would be worth doing. So > I guess it depends on how much of a speedup we gain. (Of course, it if > makes the code simpler, it may be worth doing anyway...) > > Completely agree that microbenchmarks are very useful to help us make > decisions based on facts instead of intuition. > (One thing I am learning is that it is worth running benchmarks with one > thread as well as multiple threads, and also to run in multiple OS-es if > possible: that thing with System.currentTimeMillis being so much more > expensive under Linux was a big surprise for me.) > > > > On Sun, Aug 3, 2014 at 9:34 AM, Matt Sicker <boa...@gmail.com> wrote: > >> I tried this idea out and it looked like it worked fine, but I thought >> I'd propose it here first before making any changes. There are a couple >> methods in LogManager that take a Class instead of a String for the logger >> name. I think that the provided class's ClassLoader should be passed along >> in the appropriate parameters from there and not just ignored. That way, >> when the ClassLoaderContextSelector is invoked, it will have a ClassLoader >> provided to it already and can determine the appropriate LoggerContext >> without having to use reflection. >> >> Now I'd probably want to write a microbenchmark first before really >> considering this idea, but it's not very complicated. However, this is >> really only invoked once per class approximately (provided you store the >> Logger as a static field), and if for some reason the user uses a Class >> that isn't using in the same ClassLoader as the calling Class, then it >> might cause weird issues. Then again, I might expect as a user that calling >> LogManager.getLogger(String.class), for instance, would give me the same >> Logger no matter what ClassLoader was used provided it's all on the same >> JVM. >> >> Thoughts? >> >> P.S. I was playing with the microbenchmarks last night and found this to >> be really awesome! I'm going to add some other benchmarks and migrate the >> remaining unit tests we have that are purely for benchmarking purposes into >> the log4j-perf module. There's no need to run performance tests in our unit >> tests when they don't even verify anything about the output! >> >> -- >> Matt Sicker <boa...@gmail.com> >> > > > -- Matt Sicker <boa...@gmail.com>