I saw this somewhere, I can't remember precisely, but it took my boot time from 3 minutes to 40 seconds:
rundll32.exe advapi32.dll,ProcessIdleTasks
What ProcessIdleTasks does is update the Layout.ini in the prefetch folder with the .pf entries that are in the folder, then runs the command line Defrag command with the -b switch set. This is a subset of the full defrag and repositions only the boottime modules so they're more efficiently read at boot time. It reads the Layout.ini file to determine the correct disk placements.
Now here's the catch: if your like me, your PC is never truely idle, so the ProcessIdleTasks never gets run. My home PC is never idle. The PC has to be idle for about 30 minutes before that task gets run by the Scheduler. I've confirmed this on my PC at work - the task gets run while I'm at lunch.
The workaround for that is simple: Once every three days, I manually run the "rundll32.exe advapi32.dll,ProcessIdleTasks" from Start\Run. Then I follow that up with a full defrag because moving all those files around fragments a bunch of other files. Make sure you use Microsofts defrag, most of the 3rd party Defragmenters don't honor the placements in the Layout.ini file. There is one or two, but they're expensive - unless you have the $s and know which utilities I'm talking about, then use those. Nortons SpeedDisk is not one of them.