I also get fairly slow performance out of the checkout / reset operations on windows.
This discussion got me trying to work out what's taking so long on windows. To help I used killcache [1] to flush the HDD cache and Very Sleepy [2] to profile the code. I couldn't use the GIT_TRACE_PERFORMANCE [3] patch as that seems to only work on script commands, and in my case I just get a result of "335 seconds git reset --hard head" from the log.
After running killcache I ran very sleepy connected to git, and according to the profile:
95.5% of the time is spent in do_lstat (mingw.c) / NtQueryFullAttributeFile (ntdll)
For fun, not knowing if I would break anything or not (it probably does), I wrapped the entire unpack_trees method in the fscache [4] and the total git reset --hard head time fell from 335 seconds to 28 seconds, a 11x improvement.
Albert
[1] https://github.com/sgraham/killcache
[2] http://www.codersnotes.com/sleepy
[3] https://github.com/msysgit/git/pull/38
[4] https://github.com/msysgit/git/pull/94