gpt4 book ai didi

c# - 为什么 lock 比 Monitor.TryEnter 慢很多?

转载 作者:IT王子 更新时间:2023-10-29 04:37:24 26 4
gpt4 key购买 nike

结果

锁定:85.3 微秒

Monitor.TryEnter:11.0 微秒

锁不是展开成同样的代码吗?

编辑:1000 次迭代的结果:锁定:103.3 微秒Monitor.TryEnter:20.2 微秒

代码如下。谢谢

    [Test]
public void Lock_Performance_Test()
{
const int lockIterations = 100;

Stopwatch csLock = Stopwatch.StartNew();
for (int i = 0; i < lockIterations; )
{
lock (object1)
{
i++;
}
}
csLock.Stop();

Stopwatch csMonitor = Stopwatch.StartNew();
for (int i = 0; i < lockIterations; )
{
if (Monitor.TryEnter(object1, TimeSpan.FromSeconds(10)))
{
try
{
i++;
}
finally
{
Monitor.Exit(object1);
}
}
}
csMonitor.Stop();

Console.WriteLine("Lock: {0:f1} microseconds", csLock.Elapsed.Ticks / 10M);
Console.WriteLine("Monitor.TryEnter: {0:f1} microseconds", csMonitor.Elapsed.Ticks / 10M);;
}

最佳答案

我实际上不知道答案,但我觉得有必要指出 lockMonitor.TryEnter 在功能上是等价的.来自 the MSDN documentation on Monitor.TryEnter :

If successful, this method acquires an exclusive lock on the obj parameter. This method returns immediately, whether or not the lock is available.

lock 语句类似于 Monitor.Enter,它确实可能会阻塞。当然,在您的示例代码中,不应该有任何阻塞问题;但我敢打赌,由于 lock 提供了阻塞功能,因此它(可能)比 TryEnter 做的工作多一点。


就其值(value)而言,我只是在我的机器上尝试了您的代码并得到了完全不同的结果:

100 次迭代:
锁定:4.4微秒
Monitor.TryEnter:16.1 微秒
Monitor.Enter:3.9 微秒

100000 次迭代:
锁定:2872.5微秒
Monitor.TryEnter:5226.6 微秒
Monitor.Enter:2432.9 微秒

这严重破坏了我最初的猜测,并表明,在我的系统上,lock(其性能与 Monitor.Enter 大致相同)实际上大大优于 Monitor.TryEnter.


事实上,我在 VS 2010 中尝试了此操作,同时针对 .NET 3.5 和 .NET 4.0,尽管结果不同,但在每种情况下 lock 实际上都优于 Monitor.TryEnter:

运行时版本:2.0.50727.3603

跑了100次,每次迭代100000次:
锁定:279736.4微秒
Monitor.TryEnter:1366751.5微秒
Monitor.TryEnter(无超时):475107.3 微秒
Monitor.Enter:332334.1微秒

运行时版本:4.0.30128.1

跑了100次,每次迭代100000次:
锁定:334273.7微秒
Monitor.TryEnter:1671363.4微秒
Monitor.TryEnter(无超时):531451.8 微秒
Monitor.Enter:316693.1微秒

(请注意,我还测试了没有超时的 Monitor.TryEnter,因为我同意 Marc 的观点,即调用 TimeSpan.FromSeconds 几乎肯定会减慢您的 时间Monitor.TryEnter——这些测试支持这一点——尽管这很奇怪,因为在你的情况下显然 lock 仍然显着较慢。)

根据这些结果,我强烈认为您测量的执行时间会因使用 Test 属性运行此代码而受到某种影响。那个或这个代码比我预期的更依赖于机器。

关于c# - 为什么 lock 比 Monitor.TryEnter 慢很多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2416793/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com