- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
结果
锁定: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);;
}
最佳答案
我实际上不知道答案,但我觉得有必要指出 lock
和 Monitor.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
:
跑了100次,每次迭代100000次:
锁定:279736.4微秒
Monitor.TryEnter:1366751.5微秒
Monitor.TryEnter(无超时):475107.3 微秒
Monitor.Enter:332334.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/
我是 iOS 开发新手。我正在解决的是如何在 iPhone 中运行我的应用程序时获取有关该应用程序的信息。 例如:当我在 Android 中开发时,我连接手机(使用净化模式)并打开 Android M
我仍然不确定这两个调用之间的区别。来自 MSDN, Monitor.Enter(Object) 获取指定对象的独占锁。 Monitor.Wait(Object) 释放对象上的锁并阻塞当前线程,直到它重
我是 GCP 的新手并且来自 Azure 背景。在 GCP 端是否有等效的“Azure Application Insights”用于监控应用程序? 让我用一个例子更清楚地解释我的用例:如果我有一个基
这是说明问题的最小代码: StringBuilder input = new StringBuilder(); void ToUpper() { lock (input) {
我在 ASP.NET 中有一个生产者-消费者场景。我设计了一个Producer 类,一个Consumer 类和一个用于保存共享对象并负责Producer 和Consumer 之间通信的类,我们称它为M
是否可以检测是否是同一个线程试图释放锁?我们在代码中有很多地方看起来像: try { try { if(!Monitor.TryEnter(obj, 2000))
我对并发编程有点陌生,正在尝试了解使用 Monitor.Pulse 和 Monitor.Wait 的好处。 MSDN 的例子如下: class MonitorSample { const in
如果您想在退出和清理对象时阻止执行某些代码块,是否可以使用锁来阻止执行? Monitor.TryEnter(cleanupLock, ref acquiredLock); TryEnter 可用于确保
Monitor.Enter 和 Monitor.Exit 设计为从同一线程调用。但是,如果我需要在与获得的线程不同的线程中释放锁怎么办? 例如:有共享资源和使用该资源的异步操作。该操作以 BeginO
Monitor.PulseAll 通知队列中的所有等待线程。 Monitor.Pulse 通知等待队列中的一个线程。 (下一个等待线程) 只有下一个线程(一个线程)才能获取锁。那有什么区别呢? 什么时
我正在尝试在我的 terraform 代码库中集成对 sshd 进程的 Datadog 监视器检查,但我收到 datadog_monitor.host_is_up2: error updating m
这里的问题是:如果获取对象独占锁的线程(例如通过使用 Monitor.Enter)终止,是否会神奇地释放该对象的独占锁?如果那是真的,那么假设我们从另一个线程调用 Monitor.Exit - 因为我
我正在研究 .NET 中的 Monitor 类,所以我找到了一段似乎可以正常工作的代码,但是当我将它循环一段时间时,它会抛出 OutOfMemoryException。 我在具有 8 GB RAM 的
ECMA-335 规范规定如下: *获取锁(System.Threading.Monitor.Enter 或进入同步方法)应隐式执行 volatile 读取操作,并释放锁(System.Threadi
我在 dll 中使用 OmniThreadLibrary 2.09,主应用程序和 dll 使用相同的 SimpleShareMem 内存管理器。 我用以下代码创建了自己的监视器: FMonitor
我正在使用 R 包 monitoR并收到一条我无法理解的错误消息。 我正在尝试使用 dbUploadTemplate 命令将关联模板列表(“bithTemps”)上传到 MySQL 数据库(“noh”
我想我遗漏了一些关于 Monitor.Enter 和 Monitor.TryEnter 正确行为的信息。这是我编写的一段代码,用于将问题与其余代码分开: object lockObj = new ob
我正在尝试实现一个多线程库,该库将使用线程池同时运行任务。基本上它会从它收到的收集参数中将任务添加到线程池,然后等待直到正在处理的最后一个任务发送脉冲信号。我在早期的测试中取得了成功,但是当我想测试处
我想用redis lua来实现monitor命令,而不是redis-cli monitor。但我不知道怎么办。 redis.call('monitor') 不起作用。 最佳答案 您不能从 Redis
根据语言规范,lock(obj) statement; 会被编译为: object lockObj = obj; // (the langspec doesn't mention this var,
我是一名优秀的程序员,十分优秀!