如果我有一个共享System.Diagnostics.Stopwatch实例,多个线程可以shared.ElapsedTicks安全地调用并获得准确的结果吗?
以这种方式使用秒表的共享实例和使用静态GetTimeStamp()方法之间的线程安全性/准确性方面是否存在差异?
我测量的180ms时左右间隔,并且发现使用共享实例是给我结果的价差较大,包括更短,比我期望一个显著数量.
该机器有多个CPU(2*英特尔X5550,它的价值)
查看源代码,它是线程安全的,但您一定不能使用: Stop(), Reset()and Restart()。
所以,如果你启动一个共享实例,不修改它并且只调用ElapsedXXX属性,你应该没问题。
你可以使用https://msdn.microsoft.com/en-us/library/dd642243(v=vs.110).aspx
ThreadLocal<T>
Run Code Online (Sandbox Code Playgroud)
像这样:
ThreadLocal<Random> _localRandom = new ThreadLocal<Random>(() => new Random());
ThreadLocal<Stopwatch> _localStopwatch = new ThreadLocal<Stopwatch>(() => new Stopwatch());
public void SomeTest()
{
Action someAction = () =>
{
_localStopwatch.Value.Reset();
_localStopwatch.Value.Start();
Thread.Sleep(_localRandom.Value.Next(100, 500));
_localStopwatch.Value.Stop();
Debug.Print(_localStopwatch.Value.Elapsed.TotalMilliseconds.ToString(CultureInfo.InvariantCulture));
};
var actions = Enumerable.Range(0, 1000).Select(i => someAction).ToArray();
Parallel.Invoke(new ParallelOptions {MaxDegreeOfParallelism = Environment.ProcessorCount}, actions);
}
Run Code Online (Sandbox Code Playgroud)