FreeBSD is even worse in some ways. Like other Unixes it can only fire SIGPROF for the process running as of the system tick, but it also only accounts for elapsed itimer time as of the system tick. That is, if a whole bunch of processes run during a quantum, each yielding to the next; the one running at the end of the quantum will be attributed the whole time slice and none of the other processes will record any time elapsed. (This is all based on FreeBSD 10.)
usleep doesn't seem as obviously broken as on some platforms (it doesn't seem to unconditionally give up the whole time slice), but it's definitely not very precise. I'm still figuring out what usleep does.
usleep also gives up the rest of the time slice on FreeBSD, and maybe two time slices. A usleep(100) loop sleeps for a mean of 2ms with little variance. The test doesn't fail as often on FreeBSD because the default time slice is only 1ms (according to /sbin/sysctl kern.hz), which is less than on the other systems. However, it has the same underlying problem.