I use
DIRMS It takes hours to finish (>6 last time I used it), and it works best with a script of some kind (to call it with parameters, so you don't have to memorize them), but IMO it's worth it - read the site to see why.
for lazy people:
After using the defrag API functions in the operating system to move clusters, the destination area is internally rounded up to a multiple of 16 clusters. The little gap thus created cannot immediatly be used as the destination of another move, so programs like Diskeeper just skip ahead to the next available spot. After a few seconds, these clusters become available for writing in the normal way. We beleive this has to do with the NTFS journal comittment. Anyway, if you don't wait it out, you leave little gaps.
...
The big problem is that waiting it out is slow. Several seconds is not bad, but magnify it by several thousand files, and you're looking at several days to do a complete defragmentation! So, thoughtful use of dirms will let you make incremental improvements each night, or perform more modest cleanups without adding to the interstice count
TLDR verison: DIRMS gives you better results at the sacrifice of time.
edit: DIRMS =
Do
It
Right
Micro
soft.