c#vb:我们应该将System.Lazy用于资源密集型任务吗? (当不需要穿线时)

时间:2011-04-23 19:26:53

标签: c# .net vb.net performance

我想知道是否有某种JIT-hack继续使用System.Lazy来提高性能或纯粹是“普通类”?

从页面http://msdn.microsoft.com/en-us/library/dd642331.aspx开始说:

  

使用Lazy(Of T)的实例推迟   创建一个大或   资源密集型对象或   执行资源密集型   任务,特别是在这样的创作时   或执行期间可能不会发生   该计划的有效期。

但我可以推迟使用简单的布尔标志执行资源密集型任务吗?那究竟是什么区别呢? (除了System.Lazy之外,还有额外的开销没有明显的“语法糖”增益)

使用简单的布尔标志,只需:

if (!deferred) {
    //run resource-intensive task
}

编辑:

这是一个例子

class Human{
    System.Lazy<String> name = new System.Lazy<String>(() =>
    {
        //code here takes 4 seconds to run
        return "the value";
    });
    String Name
    {
        get
        {
            return name.Value;
        }
    }
}

VS

class Human
{
    String name;
    bool name_initiated;
    String Name
    {
        get
        {
            if (!name_initiated)
            {
                //code here takes 4 seconds to run
                name = "the value";
                name_initiated = true;
            }
            return name;
        }
    }
}

5月6日:现在我用了很多。我真的很有意思。我每当需要缓存数据时都会使用它(即使计算时间为0.1秒或更小)。因此,我的问题,我应该担心吗?现在我知道你会告诉我对应用程序进行分析,但我在构建应用程序之前首先构建了库,如果应用程序出现问题会导致重大更改

4 个答案:

答案 0 :(得分:4)

是的,您可以使用简单的布尔标志推迟它。当然,你需要处理标志和结果的波动性......如果一个线程在仍在计算结果时询问结果,请确保你知道你想要的结果。哦,尽量避免锁定。并且在线程安全方面使其全部防弹。

不,使用专家建造的类型没有任何好处;)

说真的:如果有其他人为你做过,为什么要这样做呢?为什么要编写代码来检查标志,找出如何安全地等待,锁定所有内容等等。即使 是一个相对简单的事情要做对,如果它只需要完成它就更好曾经以可重复使用的方式。

这个原则的另一个好例子是Nullable<T>。您可以自己轻松地获得大多数相同的行为(不是装箱),甚至根本不打扰封装,只需在正常场地旁边保留一个标志......但内置类型,你可以免费实现所有这些,以及语法糖等。

答案 1 :(得分:2)

Lazy类使这个过程更容易。它类似于使用String而不是字符数组。在技​​术上没有必要,但可能有用。

答案 2 :(得分:2)

Lazy<T>只是实现懒惰单例的最佳方式的封装。如果你想要线程安全,那么它不仅仅是if(!initialized) instance = Initialize();。我通常认为BCL团队在实施方面比我更好。

更新:根据您的示例,我会说Lazy<>的优势就是维护代码的代码更少。除此之外,它们基本上是等同的。我的建议是:使用Lazy<>因为它很容易并且继续解决更难的问题。

答案 3 :(得分:1)

Lazy类为您完成所有线程安全工作,这是一种比手动实现更复杂的事情。