Measuring a given method's execution time
The thing you're timing is:

while (watch.Elapsed.Milliseconds &lt; precision*(100-error))
{
    action();
    ++iterations;
}


The problem is that if action takes a very short time, then most of what you're timing is the time it takes to call the watch.Elapsed.Milliseconds property.

A more accurate timer would be something like:

int iterations = 1000;
watch.Restart();
while (iterations--)
{
    action();
}
watch.Stop();


You would then need to do something to ensure you pick a suitable number of iterations (e.g. try again with 10 times as many iterations if the measured time is too short to be accurate).