Yes.

On Aug 3, 2014, at 3:18 PM, Matt Sicker <boa...@gmail.com> wrote:

> 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>

Reply via email to