小编pie*_*oxy的帖子

如何避免因锁定代码而导致速度减慢?

我想知道一段锁定代码如何减慢我的代码,即使代码从未执行过.以下是一个示例:

public void Test_PerformanceUnit()
{
    Stopwatch sw = new Stopwatch();
    sw.Start();
    Random r = new Random();
    for (int i = 0; i < 10000; i++)
    {
        testRand(r);
    }
    sw.Stop();
    Console.WriteLine(sw.ElapsedTicks);
}

public object testRand(Random r)
{
    if (r.Next(1) > 10)
    {
        lock(this) {
            return null;
        }
    }
    return r;
}
Run Code Online (Sandbox Code Playgroud)

这段代码在我的机器上运行〜1300ms.如果我们移除锁定块(但保持其身体),我们得到750毫秒.几乎是双倍,即使代码永远不会运行!

当然这段代码什么也没做.我注意到它在一个类中添加一些延迟初始化,其中代码检查对象是否已初始化,如果没有初始化它.问题是初始化被锁定并且即使在第一次调用之后也会减慢所有内容.

我的问题是:

  1. 为什么会这样?
  2. 如何避免减速

c# performance

18
推荐指数
1
解决办法
776
查看次数

标签 统计

c# ×1

performance ×1