Tuesday, November 10, 2009

Adventures in Diffing...

So today Schneier recommended AVG as a useful, free anti-virus solution. As I'm terribly anti-virus, I wanted to see if really ran "...in the background, automatically, and you won't notice any performance degradation at all." So I installed it. My first step was going to be comparing the registry before and after the install to see what sorts of things it was installing. This is where my experiment took a left turn: I just wanted to view the diff.

c:\Users\jeff\Desktop>dir *.reg
Volume in drive C has no label.
Volume Serial Number is 96A6-6911

Directory of c:\Users\jeff\Desktop

11/10/2009 09:18 AM 487,799,220 registry-after-install.reg
11/10/2009 08:53 AM 487,588,198 registry-before.reg
2 File(s) 975,387,418 bytes
0 Dir(s) 220,934,803,456 bytes free

Turns out the registry is frickin' huge! Whatever AVG did, it added about 211k of goop to the registry.

My first attempt was to use my favorite diff tool, windiff.exe. Windiff has been my trusted companion ever since I joined MSFT back in 2001. Today, for the first time, it let me down. After churning on the files for about two minutes it ran out of memory.

Very sad.  So, next we tried gnu diff from the command line.  Gnu diff allocated some memory, then allocated some more, and, in a manner much quicker than windiff, proceeded to give me garbage output because it doesn't believe in unicode.

I also tried P4Merge, but it knew its limitations.

In a last-ditch effort to get the info I wanted, I turned to the Mac.  FileMerge on OS X 10.5 (so, the 32bit version) failed as well.  It churned for awhile, the crashed with no clear reason, but I suspect it was out of memory.

So, my little experiment failed.  What did we learn from all this?  The Windows Registry is too large, I think.  Or, just trust Bruce.

Things I Hope Are Fixed In The Next Version

Exporting from the registry to disk happens on the UI thread. I hope this is fixed in regedit in Windows 7.

Loading symbols (from disk or the public symbol server) happens on the UI thread. I hope this is fixed in Visual Studio 2010.

I'm holding my breath.