It can take a bit of time with the default MS one, I'd just leave it on in the background while you're doing something else. I haven't defragged for so long now, so I should really have a (late!) spring clean
Vista's defrag never 'finishes' even after running for a day, atleast in my experience.
But i do like automatic defragmentation as implemented in the defragger which I use. It always runs in the background and defrags as necessary automatically during idle, but it takes barely any resources. So no need to schedule a defrag for only when you are cleaning up the room