<div class="gmail_extra">HI Faré,<br><div class="gmail_quote"><div class="gmail_extra">First, thanks for your excellent work on this and other projects.<br><br><br><div class="gmail_quote"><div>On Sun, Apr 22, 2012 at 1:47 PM, Faré <span dir="ltr"><<a href="mailto:fahree@gmail.com" target="_blank">fahree@gmail.com</a>></span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Dear Erik,<br>
<div><br>
> I am trying to implement a method of using a "batteries included" lisp image<br>
> (ccl, linux, 64bit) which can be used for running a variety of lisp tasks in<br>
> a batch mode. I chose to pre-load the image because it was just too slow to<br>
> load the individual fasl files at run time, either via asdf or through a<br>
> generated load-list.<br>
><br>
</div>At ITA, we also deliver applications as dumped images with lots of systems.<br>
But I admit that during incremental development,<br>
we recompile files individually with SLIME<br>
rather than load entire systems with ASDF.<br></blockquote></div><div><br>I have a bad habit of just requring or load-system'ing whatever I'm working on. I sometimes have mutliple changes that i want to get loaded.<br>


 </div><div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div><br>
> I'm using ASDF to load a small system at run-time, but finding that even<br>
> with small system (say, one file), performance is sluggish, over 2 seconds.<br>
><br>
</div>First, how big are that small system's dependencies?<br>
Because they will all be scanned.<br>
Second, how much time is spent in initialize-source-registry?<br>
Because if you reset it when dumping an image<br>
(which you probably should<br>
unless the source is guaranteed to be at the same place at runtime),<br>
it will scan all the declared source trees.<br></blockquote></div><div><br>Well, a dependency might include one or more of my own systems, and then it goes into the big wonderful world of 3rd party depencies, like iterate, ppcre, base64, sqlite, etc. <br>


<br>I haven't analysed initialize-source-registry, will do.<br><br>I have not used asdf at run-time before -- haveing used a dumped image to run just a small hook file that starts pre-loaded functions, and then any other functions loaded after this do not declare any dependencies (via require or direct asdf invocation). This is a new thing for me.<br>


 </div><div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div><br>
> It looks like the problem crops up when there are many dependencies. Poking<br>
> around the asdf code this appears to be because operate always traverses the<br>
> system dependencies, and pokes the asd files to find if they have changed.<br>
><br>
> This makes sense for asdf in development mode, since it needs to discover<br>
> changed systems. Not so good for a deployed system.<br>
><br>
</div>Well, what do you propose ASDF should do?<br>
Have some option to operate and/or traverse<br>
to skip checking some dependencies if they are already loaded,<br>
kind of a :force-not complement to :force ?<br>
I suppose I'll accept a patch that does it.<br></blockquote></div><div><br>In an abstract sense, it would be great if ASDF had a sense of target environment or strategy, I had a clever word for it before my kids came home and my brain went out the window. This would be development, deployment, testing, etc. and could wrap up things like the source, destintation directories as well as files storage types. E.g. it might be good to be able to package up stuff in zip files for delivery and have ASDF look inside them (with proper implementation of that file storage type.)<br>


<br>The target environment could be used to specialize the behavior of asdf, for instance, how asdf deals with hunting down dependencies, dealing with no source files. <br><br>It may be that the object system would already allow this by specializing operations and components, but it seems that the concept is orthogonal, no?<br>


<br>This might even be a way at getting at the problem of searching the entire depency tree for upwind changes. <br> </div><div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">



<div><br>
> ASDF assumes that since the system def file has not changed, the system<br>
> hasn't been changed either (I know there has been discussion of this<br>
> assumption.) But lets assume that at least part of the reason for that is<br>
> because it is very time consuming to check the entire set of files every<br>
> time the developer wants to recompile and load just a single file.<br>
><br>
</div>I don't think that's true, but my head hurts just thinking about it.<br></blockquote><div><br><br> </div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">



<div><br>
> Why not assume in a deployment mode that NO system will have changed if it<br>
> is already loaded in memory, and unless the application has asked that it be<br>
> reloaded? This would be for performance as well as for safety -- we really<br>
> don't want dependency checking to result in any filesystem checks, etc.<br>
><br>
</div>Because that's wrong? I don't have as many dependencies as you do when<br>
I reload a system with asdf, but usually, I do want the dependencies<br>
to be reloaded.<br></blockquote></div><div><br>Assume you have a couple dozen dependencies managed under quicklisp. These files are really hardly every updated, other than quicklisp batch update. There should be a way of ensuring that once loaded they are never consulted again during that lisp session (or in that saved image.)<br>


 </div><div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div><br>
> I feel that this problem is really pushing my grokking of asdf, but I'm<br>
> delving ahead anyway.<br>
><br>
> I haven't tested it extensively, but I did just waste a perfect sunday<br>
> morning fiddling with this:<br>
><br>
> extended module with a slot "up-to-date-p", but surely there is a better<br>
> name, this I just chose while in early play mode:<br>
><br>
> added these methods:<br>
><br>
> (defmethod operation-done-p ((o load-op) (c module))<br>
>   (module-up-to-date-p c))<br>
><br>
> (defmethod mark-operation-done ((operation load-op) (c module))<br>
>   (setf (module-up-to-date-p c) t))<br>
><br>
> tweaked the operate method so that it exits early if the module has been<br>
> marked as up-to-date<br>
><br>
>  (if (operation-done-p op system)<br>
>  (return-from operate (values op nil)))<br>
><br>
> and do-traverse to only collect "kids" if it is not done<br>
><br>
> (unless (operation-done-p operation c)<br>
>  (while-collecting (internal-collect)<br>
><br>
</div>I think that's quite wrong.<br>
How are you to maintain the up-to-date-ness of your modules?<br></blockquote></div><div><br>Yes, this is just to make "an asdf which works the way I want it to in this situation". Remember, this is for a short-lived lisp session which just needs to load a system (module) once, and to never reload an already loaded system (because there are many preloaded systems in the image.) Also, for long lived deployed sessions I'm not at all interested in reloading systems through asdf. I do have functions that may need to be reloaded, but that is through a much simpler process of loading and compiling a function and storing it in a slot somewhere.<br>


<br>In this case I was trying to use the concept of "done-ness", since it is already there in asdf. I consider a module loading to be done ... after it is loaded.<br> </div><div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">



<div><br>
> Note that this code goes in the special section of operate for handling<br>
> modules.<br>
><br>
> I think that is all that I did.<br>
><br>
> I found that the time to handle the require for my current project dropped<br>
> from about 2 1/2 to about 1/2 second.<br>
><br>
</div>I'd rather you implement a :force-not. It sounds cleaner to me.<br></blockquote></div><div><br>Ok, I'll explore that.<br> <br></div><div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">



<br>
> Thoughts?<br>
><br>
I imagine a far future where an XCVB daemon watches changes to the filesystem<br>
to detect which registered builds require an update. Not quite there yet.<br></blockquote></div><div><br>I'm very interested in the XCVB project, and this capability sounds great, but at the moment I'm working with a ton of asdf enlightened modules, including all of quicklisp, and am really interested in getting it to work optimally.<span><font color="#888888"><br>


<br>Erik.<br> </font></span></div><div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
—♯ƒ • François-René ÐVB Rideau •Reflection&Cybernethics• <a href="http://fare.tunes.org" target="_blank">http://fare.tunes.org</a><br>
The older I grow, the more I distrust the familiar doctrine that age<br>
brings wisdom.  — H.L. Mencken<br>
(Plus je vieillis, moins je crois en l'idée commune que l'age apporte<br>
la sagesse.)<br>
</blockquote></div></div><br></div>
</div><br></div>