Я на работе свой профилировщик написал. Под виндой время вычисляю с помощью QueryPerformanceCounter из kernel32.dll. Точность зависит от чипсета и составляет порядка микросекунды. Есть машины где квант чипсетного хронометра составляет 200 наносекунд, но встречаются и старые машины с квантом в 1200 нс.

## Код:
```
private static class WindowsPerformanceCounter
      {
         [System.Runtime.InteropServices.DllImport("kernel32.dll")]
         private static extern int QueryPerformanceFrequency (out long frequency);

         [System.Runtime.InteropServices.DllImport("kernel32.dll")]
         private static extern int QueryPerformanceCounter (out long counter);

         private static readonly double scale, offset;

         static WindowsPerformanceCounter ()
         {
            long frequency;
            QueryPerformanceFrequency(out frequency);
            if (frequency > 0)
            {
               scale = 1.0 / frequency;
               long count;
               QueryPerformanceCounter(out count);
               offset = scale * count;
            }
         }

         // Время в секундах прошедшее после инициализации.
         public static double GetSeconds ()
         {
            long count;
            QueryPerformanceCounter(out count);
            return scale * count - offset;
         }
      }
```

Просто тупо засекаю время на входе в профилируемую процедуру и на выходе.