This leads to interesting question. Since, one presumes you won't need all 1000 service immediately, could building the container be spun off as a background task? This of course would lead to some interesting race conditions, but if most of those services are for corner cases (ie, say 90% of your functionality could be handled by 10% of the services), then it just become a case of filling it in th eproper order, and releasing semaphores as you go.
On Wed, Sep 16, 2009 at 12:05 PM, Tyler Burd <[email protected]> wrote: > I have another similar project that has around 300 services, and the average > AddComponent time there is 20ms, so that would make sense. I’ll try to get > profile results today (have to buy dotTrace first). > > > > From: [email protected] > [mailto:[email protected]] On Behalf Of Ayende Rahien > Sent: Wednesday, September 16, 2009 3:00 AM > To: [email protected] > Subject: Re: long startup time > > > > IIRC, > > We saw something like that previously, I think that there is an O(N) > operation in Windsor somewhere. > > On Wed, Sep 16, 2009 at 7:19 AM, Tyler Burd <[email protected]> wrote: > > Hi all, > > > > I’ve got a large application that takes about 1 minute to start up. I > investigated today what could be the cause of this very long delay, and > narrowed it down to the WindsorContainer.AddComponent method. I have about > 1000 service classes, each with an interface (the service type). The > average time to call WindsorContainer.AddComponent is 52ms on my system. > 52ms * 1000 is 52 seconds, which is the vast majority of the app’s startup > time. > > > > My system is a Quad Core, 2.66GHz Core2 running Windows XP. The same > approximate startup time can be verified on multiple machines, servers, and > OS’s. > > > > Is this normal? Do I have to just bite the bullet on a long startup time, > or is there something I can do to help this? > > > > Here is the block of code in a small executable I used to calculate the > times. I can provide a profile report if necessary. I normally use > AllTypes along with the fluent registration, but I wanted to get as > low-level as possible. This code outputs: > > “Called AddComponent 957 times. Average AddComponent time: 52.0267175572519ms” > > > > > > var container = new WindsorContainer(); > > > > //calculates the time for each AddComponent call > > var watch = new Stopwatch(); > > > > var totalAddComponentCalls = 0; > > > > //keeps track of the average ms to call AddComponent > > var allAddComponentTimes = new List<long>(1000); > > > > foreach (var classType in > typeof(TheBigApplicationThingyWithAllTheServices).Assembly.GetTypes()) > > { > > if (classType.IsInterface) > > continue; > > if (classType.Namespace == null) > > continue; > > if (!classType.Namespace.Contains("Services")) > > continue; > > var interfaces = classType.GetInterfaces(); > > if (interfaces.Length == 0) > > continue; > > var firstInterface = interfaces[0]; > > > > var serviceName = totalAddComponentCalls.ToString(); > //simple way to get unique name > > watch.Start(); > > container.AddComponent(serviceName, firstInterface, > classType); > > watch.Stop(); > > allAddComponentTimes.Add(watch.ElapsedMilliseconds); > > watch.Reset(); > > ++totalAddComponentCalls; > > } > > > > var avgAddCompTime = (from ms in allAddComponentTimes select ms).Average(); > > Console.Out.WriteLine(string.Format("Called AddComponent {0} times. Average > AddComponent time: {1}ms", totalAddComponentCalls, avgAddCompTime)); > > > > > > > > > > -- Truth, James --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Castle Project Users" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/castle-project-users?hl=en -~----------~----~----~----~------~----~------~--~---
