-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi,
On 10/24/2011 11:03 PM, Charles Oliver Nutter wrote: > Nahi planted an interesting seed on Twitter...what if we could > parallelize parsing of Ruby files when loading a large > application? I once stated this idea for CRuby in [ruby-list:48136], as a possible feature in a discussion for 'require should take multiple features as an array'. (The proposal is not mine) require ['csv', 'json', 'yaml'] I said 'it would make require parallelize' but Matz responded at [ruby-list:48140] Would you like to take pains over the problem depending on the loading timing throughout life? Give me a break! In addition, you might know he hates autoload [ruby-core:39844]. Sigh, we don't work very well. Back to the topic. > At a naive level, parallelizing the parse of an individual file is > tricky to impossible; the parser state is very much straight-line. > But perhaps it's possible to parallelize loading of many files? > > I started playing with parallelizing calls to the parser, but that > doesn't really help anything; every call to the parser blocks > waiting for it to complete, and the contents are not interpreted > until after that point. That means that "require" lines remain > totally opaque, preventing us from proactively starting threaded > parses of additional files. But there lies the opportunity: what if > load/require requests were done as Futures, require/load lines were > eagerly interpreted by submitting load/require requests to a thread > pool, and child requires could be loading and parsing at the same > time as the parent file...without conflicting. I might misunderstanding something. But you're discussing only 'load' (read in source as a stream) and 'parse' (create AST), not evaluating it, right? Or does it include evaluation phase? Say: a.rb require 'a/b' require 'a/c' a/b.rb module A sleep 10 module B FOO = 1 end end a/c.rb module A module C BAR = B::FOO end end How does your Futures work? Ah, a new mail arrived from Jonathan Coveney. I think I'm saying the same thing. Changing LoadService as you stated sounds it includes evaluation phase. But I'm a little bit far from JRuby source code recently, I might be wrong. // NaHi > In order to do this, I think we would need to make the following > modifications: > > * LoadService would need to explose Future-based versions of > "load" and "require". The initial file loaded as the "main" script > would be synchronous, but subsequent requires and loads could be > shunted to a thread pool. * The parser would need to initiate eager > load+parser of files encountered in require-like and load-like > lines. This load+parse would encompass filesystem searching plus > content parsing, so all the heavy lifting of booting a file would > be pushed into the thread pool. * Somewhere (perhaps in > LoadService) we would maintain an LRU cache mapping from file paths > to ASTs. The cache would contain Futures; getting the actual parsed > library would then simply be a matter of Future.get, allowing many > of the load+parses to be done asynchronously. > > For a system like Rails, where there might be hundreds of files > loaded, this could definitely improve startup performance. > > Thoughts? > > - Charlie -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQEcBAEBAgAGBQJOpkFjAAoJEC7N6P3yLbI2OEAIAMXfaOM666jS40UFm7uHY8/H 2qpkWp8az9cnt8GvBfyx6d1h9aTeo8TQr/r8mXod/Ahq/WyagbbMIGRALr2AA8xA sDOdw7X5s1QObF4CtlnQ5fRveOtwvPYy1cNgdSizetb2yx6R3xLbdnSeIYbYwsMQ p5q3GxSnU4o8qY9hm0IzzU9t6qKuWsRXVgknLdJWfIFfccpe8z3HHDCCDScXC08p nk70hA3px37tmxJM0GNSSNQs/V9D591wegE/xkO/jaM11mAggQPtHCIUxeSy/ikF vOJ/9N2c79TZHffXsnfq6yEhyBIbWUudhwBt7exIkbmSpGBRVzlwfh2GPj9D5Ss= =OdJs -----END PGP SIGNATURE----- --------------------------------------------------------------------- To unsubscribe from this list, please visit: http://xircles.codehaus.org/manage_email