Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# vb:我们应该使用System.Lazy来完成资源密集型任务吗?(不需要螺纹时)_C#_.net_Vb.net_Performance - Fatal编程技术网

C# vb:我们应该使用System.Lazy来完成资源密集型任务吗?(不需要螺纹时)

C# vb:我们应该使用System.Lazy来完成资源密集型任务吗?(不需要螺纹时),c#,.net,vb.net,performance,C#,.net,Vb.net,Performance,我想知道系统中是否存在某种JIT黑客行为。懒惰地使事情更具性能,还是纯粹的普通类 页面上写着: 使用LazyOf T的一个实例来延迟 创建一个大的或多个 资源密集型对象或 执行资源密集型 任务,尤其是在创建 或者,执行过程中可能不会发生 程序的生命周期 但是我可以使用一个简单的布尔标志延迟资源密集型任务的执行,不是吗?那么到底有什么区别呢?除了System.Lazy之外,它还有额外的开销,没有明显的语法增益 使用简单的布尔标志,其简单: if (!deferred) { //run re

我想知道系统中是否存在某种JIT黑客行为。懒惰地使事情更具性能,还是纯粹的普通类

页面上写着:

使用LazyOf 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;
        }
    }
}

梅6:现在我经常用这个。我真的是说很多很多。我在需要缓存数据时使用它,即使计算时间为0.1秒或更短。因此,我的问题是,我应该担心吗?现在我知道你会告诉我评测这个应用程序,但是在我构建这个应用程序之前,我会先构建这个库,到那时,如果这个应用程序出现了问题,这将意味着重大的改变,那么惰性类会使这个过程变得更容易。它类似于使用字符串而不是字符数组。技术上不需要,但可能有用。

惰性类使过程更容易。它类似于使用字符串而不是字符数组。技术上不需要,但可能有用。

是的,您可以使用一个简单的布尔标志延迟它。当然,您需要处理标志和结果的波动性。。。如果一个线程在计算结果时请求结果,请确保您知道您想要的结果。哦,尽可能避免锁定。并使其在螺纹安全方面完全防弹

不,使用专家制造的型号毫无益处

严肃地说:如果别人为你做了,为什么要自己做呢?为什么要编写代码来检查标志、确定如何安全等待、锁定所有东西等等。即使这是一件相对简单的事情,但如果只需要以可重用的方式执行一次就更好了


这个原则的另一个很好的例子是Nullable。您可以轻松地获得大部分相同的行为,而不必装箱,甚至根本不必担心封装,只需在正常字段旁边保留一个标志。。。但是对于内置类型,您可以免费实现所有这些,以及语法糖等。

是的,您可以使用一个简单的布尔标志来延迟它。当然,您需要处理标志和结果的波动性。。。如果一个线程在计算结果时请求结果,请确保您知道您想要的结果。哦,尽可能避免锁定。并使其在螺纹安全方面完全防弹

不,使用专家制造的型号毫无益处

严肃地说:如果别人为你做了,为什么要自己做呢?为什么要编写代码来检查标志、确定如何安全等待、锁定所有东西等等。即使这是一件相对简单的事情,但如果只需要以可重用的方式执行一次就更好了


这个原则的另一个很好的例子是Nullable。您可以轻松地获得大部分相同的行为,而不必装箱,甚至根本不必担心封装,只需在正常字段旁边保留一个标志。。。但是使用内置类型,您可以免费实现所有这些功能,以及语法糖等。

懒惰类为您完成所有线程安全工作,这类工作比手动实现听起来要复杂得多。

懒惰类为您完成所有线程安全工作,这是一种比手工实现听起来要复杂得多的东西。

Lazy只是对实现Lazy singleton的最佳方法的封装。如果你想要线程安全,那么不仅仅是如果!初始化实例=初始化;。我通常认为BCL团队比我更擅长实施

更新:根据您的示例,我想说Lazy的优点是维护的代码更少。除此之外,它们本质上是等价的。我的建议是:使用Lazy,因为它很简单,并且可以解决更难的问题。

Lazy只是对实现Lazy单例的最佳方法的封装。如果你想要线程安全,那么不仅仅是如果!初始化实例=初始化;。我通常认为BCL团队比我更擅长实施


更新:根据您的示例,我想说Lazy的优点是维护的代码更少。除此之外,它们本质上是等价的。我的建议是:使用Lazy,因为它很简单,并且可以解决更难的问题。

您可以向技术人员展示如何使用简单的布尔标志延迟加载/执行吗?你可以从我开始,让不那么懒惰的人给出答案。。。哦

顺便说一句,F使用Lazy并提供了一些语法。让ls=lazy[1;2;3]@Nick我已经编辑了这个问题,以显示如何使用一个简单的布尔标志延迟加载/执行。@Nick。。这个链接证明了使用惰性评估的合理性,我对此没有争论。但这并不能证明使用System.Lazy是合理的,这就是为什么我说我们可以通过一个简单的布尔标志实现懒惰计算为什么要使用System.Lazy?@Pacerier,但它是如何延迟的?计算是如何触发的?这个标志的语义是什么?你认为这项任务是随意的还是急切的?无论如何,乔恩·斯基特已经给出了一个很好的答案。看一看。如果您想知道它为什么会存在,请看另一篇文章如何实现单例模式:它也可以通过简单的布尔标志来实现;您能否向Techque演示如何使用简单布尔标志延迟加载/执行?你可以从我开始,让不那么懒惰的人给出答案。。。顺便说一句,F使用了Lazy,并提供了一些语法糖。让ls=lazy[1;2;3]@Nick我已经编辑了这个问题,以显示如何使用一个简单的布尔标志延迟加载/执行。@Nick。。这个链接证明了使用惰性评估的合理性,我对此没有争论。但这并不能证明使用System.Lazy是合理的,这就是为什么我说我们可以通过一个简单的布尔标志实现懒惰计算为什么要使用System.Lazy?@Pacerier,但它是如何延迟的?计算是如何触发的?这个标志的语义是什么?你认为这项任务是随意的还是急切的?无论如何,乔恩·斯基特已经给出了一个很好的答案。看一看。如果您想知道它为什么会存在,请看另一篇文章如何实现单例模式:它也可以通过简单的布尔标志来实现;String确实提供了许多CLR级别的优化,您无法在运行时之外使用简单的char[]来实现这些优化。@dahlbyk:在这两种情况下,使用String的要点都是语义的简单性。如果您愿意,您可以自己进行实习,但方式不完全相同,但如果您知道自己在做什么,您可以获得绝大多数性能。String确实提供了许多CLR级别的优化,您无法在运行时之外使用简单的char[]实现这些优化。@dahlbyk:在这两种情况下,使用字符串的要点是语义简单。如果你愿意,你可以自己实习,但方式不完全相同,但是如果你知道自己在做什么,你可以获得绝大多数的性能。@Jon,你对单例实现有很好的了解,你可以链接到这里,因为单例也可以通过简单的布尔标志来实现。尼克:好吧,你可以用Lazy实现singleton模式,但实际上这不是同一回事。。。我想我不想在我的答案中混淆视听,但现在的评论中已经有了链接:@Jon,我只是想表明:事情可能比总览中看起来更复杂。Singleton和你的文章和书都是这方面很好的演示。当然,我不认为懒惰和单身模式是一样的:@Jon Skeet对不起,我想我的问题还不清楚。我将我的问题编辑为:当线程不可用时,我们是否应该使用System.Lazy执行资源密集型任务required@Pacerier当前位置你问题的上下文仍然不清楚。如果你能给我们看一个完整的样品,我们就可以知道懒惰是否有用。这是一种表示首次需要时要计算的值的方法,然后可以重复使用。如果你不在那种情况下,它就没用了。@Jon,你对单例实现有很好的了解,你可以把它链接到这里,因为单例也可以通过简单的布尔标志来实现。尼克:好吧,你可以用Lazy实现singleton模式,但实际上这不是同一回事。。。我想我不想在我的答案中混淆视听,但现在的评论中已经有了链接:@Jon,我只是想表明:事情可能比总览中看起来更复杂。Singleton和你的文章和书都是这方面很好的演示。当然,我不认为懒惰和单身模式是一样的:@Jon Skeet对不起,我想我的问题还不清楚。我将我的问题编辑为:当线程不可用时,我们是否应该使用System.Lazy执行资源密集型任务required@Pacerier当前位置你问题的上下文仍然不清楚。如果你能给我们看一个完整的样品,我们就可以知道懒惰是否有用。这是一种表示首次需要时要计算的值的方法,然后可以重复使用。如果你不在那种情况下,那就没用了。对不起,我想我的问题不太清楚。我将我的问题编辑为:我们应该使用System.Lazy来完成资源密集型任务,而不需要线程。对不起,我想我的问题还不清楚。我将我的问题编辑为:我们应该使用System.Lazy来完成资源密集型任务,而不需要线程。对不起,我想我的问题还不清楚。我将我的问题编辑为:我们应该使用System.Lazy来完成资源密集型任务吗
如果不需要线程,对不起,我想我的问题还不清楚。我把我的问题编辑成:当不需要线程时,我们应该使用System.Lazy来完成资源密集型任务吗
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;
        }
    }
}