From: Jim A. <ji...@tr...> - 2001-03-20 18:26:00
|
Finn Bock wrote: > The code in a PyTableCode is implemented by a > dynamicly created java class and we do not keep the original java > bytecode around. Even if we kept and saved the java bytecode, loading a > page would still have to recreate a java class for each PyCode. Thanks, now I see why that approach was so slow... > It pains me a lot to say it, but this is one situation where jython's > compile-to-bytecode approach fails to deliver high performance. > > Depending on the design of your forms, if you could collect all the > expressions found on a page into one jython source string: > > """ > def func001(): > return Customer.Name > def func002(): > for p in Customer.Phones: > print p > """ > > then the slow class creation would only occur once for the page. > > PyCode code = __builtin__.compile(pagesrc, "<string>", "exec"); > PyStringMap dict = new PyStringMap() > Py.exec(code, dict, dict) > > and the evaluation of each expression would run at full jython speed: > > PyObject result = dict.__getitem__("func001").__call__(); This is very interesting, I had not considered that approach, since I did not clearly understand where the slowdown was (creating classes). I probably could have had something running by now had I thought of it... But in the meantime, I have been working on a different (more work!) approach where I build jython source for the entire page, with 'callbacks' to Java routines that do extra work: pagePCL = "" errorList = [] ... cmdResult = Customer.Total // User's original expression cmdResult = FillFiller.FormatResults(cmdResult,'#,##0.00') cmdResult = FillFiller.FillSegments(cmdResult, ((525,2322,478)),false,10,'',error) errorList.append(error) pagePCL += cmdResult ... This approach requires more restructuring of my code so I have not been able to benchmark it yet: I'm still working on all the 'callbacks'. Some of them could be rewritten in Python too but I'm not sure that would buy me anything. Then I was going to build a 'cache' (HashMap) of the code-objects for the forms in a servlet so I can just keep the compiled pages in memory (I got this idea while checking out 'Python Server Pages': http://www.ciobriefings.com/psp/ ). There will be hundreds, and eventually maybe thousands, of forms being run so I'm hoping this will be OK: a JDOM tree is cached along with an array of pages (although I may be able to get rid of that with more custom structures later...). Later, with some more restructuring/rewriting I might be able to build complete Python forms and compile them to Java classes (and dynamically load them?), this would save the initial compile (but not much more?). Thanks again for your reply; do you see any problems with my new approach ? -- __o Jim Adrig _ \<,_ ji...@tr... ' `/ ' ` ___________ `-' `-' |