gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:12:08 25 4
gpt4 key购买 nike

我有一个通用词典,正在将其用作线程.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/

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