Jim Hogg of Microsoft posted this little nugget on the DOTNET-CLR list in response to a question about how to get NGEN running as part of a setup script.
NGEN stores its results into the "Native Image Cache" -- physically, a collection of directories below \windows\assembly -- it's not actually the GAC, but brought to us by the same dev team.
Note that there's a couple of items to watch out for with using Custom Actions to trigger ngen: they need to run during a setup phase where it has SysAdmin privs; and as a consequence, there's a gotcha if the user disables rollback, yet ngen fails. (I don't understand the details: my info is second-hand).
Also, beware of "servicing" issues. For example, the user upgrades his machine; or changes security policy. In these cases, your NGEN'd images may be rendered unusable. In which case, the CLR will silently fall back to JIT'ing -- so it's not a fatal disaster -- all your Apps still work. To guard against this, you might think about providing a small command file that the user can run to re-NGEN your assemblies, putting Humpty Dumpty back together again.
(As use/importance of NGEN grows, so we're working on making NGEN "self-healing" in the face of servicing -- for the Whidbey release)
I think the most interesting part about his (very nice) response is the last paragraph. Seeing hints like this about Whidbey is always interesting.
What’s especially interesting in this case is that it sounds like they’re about to make NGEN (potentially) a whole lot more useful. If you don’t already know, NGEN is the tool that pre-compiles your assemblies, to save the overhead of the JIT compilation that occurs at runtime. Today, NGEN isn’t very interesting, because any change to the system rightfully invalidates the compiled image and causes it to fall back on the regular JIT compiler. If NGEN images were self-recreating, it could provide a performance improvement, especially around startup times, which is where most of the JIT cost is. The tradeoff is a larger working set, but that might be worthwhile in some scenarios.
I've only recently found out about NGEN, but I'm definitely loving it. The biggest complaint that I've had about .NET in general so far is that startup times for apps seem to be so slow - now, with NGEN, that can all go away. Plus, it sounds like it's going to get even better with the next release, which is just excellent.
ReplyDelete