Hey guys, i could do with some advice.

== the problem ==

In the java version, the features are all parsed and their javascript content is loaded into memory. This works on the java side, and gives the opportunity to cajol the entire content in one fell swoop, so that works great.

Now on the PHP side of things things are a bit difference since PHP works in a process-per-request type situation, so parsing the entire features structure each request is non-doable, would make any semi decent performance impossible to achieve, so instead i process the features once and cache the entire resulting structure in cache, thats about twice as fast as processing the features structure each request, so it's survivable.

Survivable but far from optimal, it's a lot of information to read from cache, and a lot of memory consumed (since every process has it's own instance, it adds up), so that puts a good bit of pressure on the server's IO.

To add some measurability to this, on a quad core @ 3ghz workstation this gets me about 420 pages a second with apache bench.

== the solution ? ==

The main problem is the overhead of loading all the features javascript each request, this consumes tons of memory and takes loads of IO, so the overly obvious solution is to not do this anymore :)

So what would work is that i make all javascript external (<script src="...">), generate script tags for each feature (and it's dependencies) and modify the javascript handler (/gadgets/js) to only output the javascript for the requested feature.

There are a few possible downsides i can identify though:

More requests, one per feature, however with an expiration data in the far far future and a cache busting version param, this should be negligible.. besides the amount of bandwidth used would go down tremendously (a few small kb for a gadget instead of 180kb or so because of all the inline javascript), so the combined browser side caching of savings on bandwidth / time to transfer all this info ... should actually have a positive effect right?

The second risk is that it could add some perceived latency since the gadgets.config.init() and the onLoad handlers can't be called until the document has completed, which includes handling the javascript files, and whatever external resources the gadget includes.. this is probably the biggest problem of this solution.

And finally, it would make cajoling impossible probably ... but that doesn't concern me so much right now since we don't have a mechanism for php shindig to do that anyhow :)

With that 'small' modification, the pages/second shoots up to 630, a very significant increased, and that's with just a few hacks and not a proper implementation of this option.

So the performance gains seem significant enough to consider this, both in server load, pages/second and bandwidth saved.. however as mentioned, there's a few risks involved too.

What do you all reckon would be the right solution here? Hope i can get your opinions on what would be the better choice here since I'm a bit torn between the two.

        -- Chris

Reply via email to