.net - 在线程(.NET)中锁定或 try catch 字典是否更有效

标签 .net multithreading dictionary locking try-catch

我有一个通用词典,正在将其用作线程.NET项目(C#)中的缓存。我将在字典上进行大量读取(在高峰时间每秒可能读取数百次或更多)。

我有一个简单的Get(int id)方法,如果它在缓存中,则应该返回一个CustomObject,否则返回null。

我的问题:
锁定字典是更快/更有效的方法,还是仅使用try/catch块?

假设字典存储在名为“dic”的变量中。

锁定样本:

public CustomObject Get(int id)
{
   lock(dic)
   {
      if (dic.ContainsKey(id))
         return dic[id];
   }
   return null;
}

尝试/捕获样本:
public CustomObject Get(int id)
{
   try
   {
      return dic[id];
   }
   catch
   {
      return null;
   }
}

最佳答案

我认为您应该在自己的环境中对其进行测试。基本上:

  • Lock很便宜
  • 尝试而不会出现异常很便宜,甚至可能更便宜然后锁定
  • 尝试获取异常非常昂贵

  • 因此,现在的问题是,您期望多久发生一次高速缓存未命中,并因此引发异常。我会选择lock(),因为它的执行时间不取决于您是否会遇到缓存命中,这意味着它更可预测和可测量,同时仍然非常便宜。我认为每秒数百次点击不会有任何问题。

    我所做的简单测试表明,使用try/catch获取缓存缺失非常非常昂贵。

    编辑:

    简单测试表明:
  • 100k检索
  • 的无掷费用约为2毫秒
  • 锁定成本约为6毫秒
  • 试 throw 成本约4秒

  • 这意味着使用lock(),因为如果您在数千次尝试中获得1次以上的高速缓存未命中,则它比try/catch效率更高,并且更加稳定,不受运气的影响。

    关于.net - 在线程(.NET)中锁定或 try catch 字典是否更有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6934943/

    相关文章:

    .net - 从 SQL 错误消息 547 获取特定信息

    .net - SSL 和 ASP.NET MVC

    java - Java中父子线程的通信

    .net - 使用特定 DLL 库时内存分配非常高。或许。不知道该怎么办

    python - 对 Counter 字典中的值求和

    python - 将列表转换为嵌套字典?

    c# - 如何为 LINQ 查询构建动态 FROM 子句?

    c# - LocalService 的 'Access is denied' 的解决方法

    java - 关于线程和锁的问题

    python - 将字典列表转换为元组字典