首页 \ 问答 \ c#vb:我们应该使用System.Lazy进行资源密集型任务吗?(c# vb: Should we use System.Lazy for resource-intensive task? (when threading is not needed))

c#vb:我们应该使用System.Lazy进行资源密集型任务吗?(c# vb: Should we use System.Lazy for resource-intensive task? (when threading is not needed))

我想知道是否有某种与System.Lazy一起进行的JIT-hack以使其具有更高的性能,或者它纯粹是一个“普通类”?

从页面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秒或更少),我都会使用它。 因此,我的问题,我应该担心吗? 现在我知道你会告诉我应用程序的配置文件,但我建立图书馆之前,我建立的应用程序,并在那个时候,如果应用程序有问题,这将意味着重大变化


I'm wondering is there some kind of JIT-hack going on with System.Lazy to make things more performant or is it purely a "normal class"?

From the page http://msdn.microsoft.com/en-us/library/dd642331.aspx it says:

Use an instance of Lazy(Of T) to defer the creation of a large or resource-intensive object or the execution of a resource-intensive task, particularly when such creation or execution might not occur during the lifetime of the program.

but i can defer the execution of a resource-intensive task using a simple boolean flag couldn't i? So what exactly is the difference? (other than System.Lazy has additional overheads for no apparent "syntax sugar" gains)

With a simple boolean flag its simply:

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

Edit:

here's an example

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;
        }
    }
}

6 May: now i use this alot. And i really mean alot alot. i use it whenever i need to cache data (even when the computation is 0.1 second or lesser). Hence my question, should i be worried? Now i know you will tell me to profile the app, but im building the library first before i build the app and by that time if the app has problems that would mean Major change


原文:https://stackoverflow.com/questions/5766376
更新时间:2021-06-08 20:06

最满意答案

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

那么,使用由专家构建的类型根本没有好处;)

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

这个原理的另一个很好的例子是Nullable<T> 。 你可以很容易地获得大部分相同的行为(不是装箱),甚至根本不打扰封装,只需要在标准字段旁边加上一个标志......但是使用内置类型,你可以完成所有的实现免费,以及语法糖等。


Yes, you could defer it with a simple Boolean flag. Of course, you'd need to handle volatility of both the flag and the result... and make sure you knew what you wanted in terms of the result if one thread asks for the result while it's still being computed. Oh, and try to avoid locking where possible. And make it all bulletproof in terms of thread safety.

Nah, no benefit at all to using a type built by experts ;)

Seriously: why do it yourself if someone else has done it for you? Why write the code to check a flag, work out how to wait safely, lock everything etc. Even if it were a relatively simple thing to get right, it's better if it only needs to be done once in a reusable fashion.

Another good example of this principle is Nullable<T>. You could easily get most of the same behaviour yourself (not boxing) or even not bother with the encapsulation at all, and just keep a flag alongside your normal field... but with the built-in type, you get all of that implemented for free, along with syntactic sugar etc.

相关问答

更多

c#vb:我们应该使用System.Lazy进行资源密集型任务吗?(c# vb: Should we use System.Lazy for resource-intensive task? (when threading is not needed))

是的,你可以用一个简单的布尔标志推迟它。 当然,你需要处理标志和结果的波动......并且如果一个线程在计算结果时请求结果,请确保你知道你想要的结果。 哦,并尽可能避免锁定。 并且在线程安全性方面做到防弹。 那么,使用由专家构建的类型根本没有好处;) 严重:如果别人为你做了,为什么要这样做呢? 为什么编写代码来检查一个标志,确定如何安全地等待,锁定所有的东西等等。即使它是一个相对简单的事情,如果它只需要以可重用的方式进行一次就更好。 这个原理的另一个很好的例子是Nullable<T> 。 你可以很 ...

了解MEF System.Lazy (Understanding MEF System.Lazy)

经过一些反思我觉得我可以开始制定一个答案,虽然事实证明很多事情正在发生,所以这个答案可能会发生变化。 我正在写下来听听自己学习这个的好处。 MEFBootsrapper.Run() ... MEFBootstrapper.Container.GetExports(...)因为CompositionContainer : ExportProvider, ...和ExportProvider定义了public Lazy<T, TMetadataView> GetExport<T, TMetadataV ...

委托'System.Action '不带0个参数(Delegate 'System.Action' does not take 0 arguments)

编译器告诉你错误,因为你调用.ContinueWith并给它一个委托,它接受0个参数,而.ContinueWith期望Action<Task> not Action 。 要解决您的问题,请按以下方式更改代码: Task myTask = Task.Factory.StartNew(() => TestMethodRefresh()); myTask.ContinueWith((t) => TestMethodPrint(null), new CancellationToken()); 其他重载可 ...

更好的架构将资源密集型工作外包给另一个项目(Better architecture to outsource resource-intensive work to another program)

使用套接字在执行工作的服务器上进行通信并使用本机软件。 没有好的框架处理这个主题,因为它非常特定于应用程序。 写下这样的东西: https : //gist.github.com/Doralitze/fa3f81640da4be046b40 你可以用你想要的任何语言编写远程软件,但我会推荐c ++。 也可以用java编写软件(但我真的建议使用gcj来编译它)。 无论如何(如果您决定使用c ++),您应该使用编译器标志来优化代码以获得最高性能并启用cpu特定优化。 Use sockets to co ...

让Windows Phone 8资源密集型任务运行的任何提示?(Any Tips for getting Windows Phone 8 Resource Intensive Task to Run?)

我于2013年2月4日与微软公开了支持事件,并于2月5日回复了他们,内容如下: 我与内部Windows Phone开发人员合作并确认了以下内容: 在发布模式下,Windows Phone 8操作系统中不会触发ResourceIntensiveTask(即资源密集型代理)。 仅供参考,自动上传使用ResourceIntensiveTasks,因此它在WP8中也不起作用。 计划将一个修复程序包含在未来的Windows操作系统更新中,很可能在今年春天晚些时候。 修复程序需要通过构建其特定于硬件的Wind ...

短轮询是否比消息队列消耗更少的资源?(Is short-polling less resource-intensive than message queues?)

它归结为轮询频率和每次轮询的开销。 如果您不经常轮询,那么它可能会消耗更少的资源来执行crontab中的bash脚本之类的操作,因为资源仅在轮询期间使用。 如果您经常轮询以至于您的轮询脚本花费的时间比休眠时间长,那么使用类似消息队列之类的东西并支付更小但更常量的间接费税可能更有意义。 使用shell脚本进行“短轮询” 每个循环都涉及启动一个bash进程,而bash进程会分离一些子进程来执行读取文件和通过grep运行结果等任务,然后你就会有一些可衡量的开销。 如果检查结果是肯定的,则分叉其他脚本或进 ...

需要转换类型,但Task 和Task 是一样的吗?(Convert type needed, but are Task and Task the same?)

您的TUser不一定与IUser接口相同,它可能是从IUser继承的某种类型。 修复它的最简单方法(如果适用于你)就是在任何地方使用IUser : public class BaanUserStore : IUserStore<IUser>, IUserPasswordStore<IUser> { public Task<IUser> FindByNameAsync(string userName) { //Wrong type!! ...

这是使用.NET的System.Lazy的好方法吗?(Is this good way of using .NET's System.Lazy)

如果你已经有了内存中的对象(在setter的情况下),那么使用延迟加载真的没有意义,但这样做完全没问题。 我能想到的一件事是,如果你检查_headshot.IsValueCreated ,它将返回false,即使你已经有了内存中的对象。 另一种选择是 private Image _headshot; public Image Headshot { get { return _headshot ?? (_headshot = LoadHeadshotFromHDD()); } se ...

转换 - '结果'不是'System.Threading.Tasks.Task'的成员(Conversion - 'Result' is not a member of 'System.Threading.Tasks.Task')

这是因为VB.NET类型推断在Visual Studio 2010中并不是很好。您需要通过指定客户端返回的实际类型为编译器提供一些额外的帮助client.GetAsync() ,如下所示: client _ .GetAsync("api/products/2") _ .ContinueWith( _ Sub(t As Task(Of HttpResponseMessage)) ... End Sub, _ TaskSche ...

相关文章

更多

最新问答

更多
  • 如何从远程文件拉取文件而不覆盖本地文件?(How do I pull files from remote without overwriting local files?)
  • Reactjs:状态改变时重新渲染iframe(Reactjs: re-renders iframes when state changed)
  • 奇怪的网址,以及跟随php页面流程的困难(odd url, and difficulty in following the php page flow)
  • 标签活动无效(Tab Activity is not working)
  • JavaME合适的语法编译器建议?(JavaME-suitable grammar compiler recommendations?)
  • 指定参数(Specifying arguments)
  • 可以通过Ruby插件或控制台覆盖Sketchup中的键盘快捷键吗?(Can one override keyboard shortcuts in Sketchup through the a Ruby Plugin or Console?)
  • 计算Java EE Web App中用户数的最佳方法(Best way to count number of users in a Java EE web App)
  • 无法使用templateUrl加载cordova中的外部模板(unable to load external templates in cordova with templateUrl)
  • PHPExcel:写入期间无法使用缓存(PHPExcel: Unable to use cache during write)
  • 在javascript中嵌套这个指针(nested this pointer in javascript)
  • 谁跟领航致远培训过,有问题问下啊
  • 控制器要求在入门时下载(Controller ask to download on entry)
  • 未能通过conda安装Asyncio(Failure to install Asyncio via conda)
  • 如何查找已完成项目的总长度?(How to find length of total completed items?)
  • 如何检查OleInitialize是否已被调用?(How to check if OleInitialize has already been called?)
  • SQL在特定范围内返回列中具有最大值的行(SQL Returning rows with max value in column, within a specific range)
  • preg_match从url获取id(preg_match get the id from url)
  • 如何在运算符中为make方程转换perl变量?(How to convert a perl variable in a operator for make equations?)
  • 在导航上方添加空格/标题。(Add a white space/ header above navigation.)
  • MeetingItem已保存;(MeetingItem saved; but change now shown in Calendar)
  • c#vb:我们应该使用System.Lazy进行资源密集型任务吗?(c# vb: Should we use System.Lazy for resource-intensive task? (when threading is not needed))
  • 为什么在armeabi代码中使用armeabi-v7a代码?(Why use armeabi-v7a code over armeabi code?)
  • 获取请求的自定义标头(Java HTTP)(Fetching a custom header of a request (Java HTTP))
  • 是否可以在嵌套的if语句中从varchar转换为numeric以动态评估参数?(Is it possible to convert from varchar to numeric within a nested if statement in order to dynamically evaluate a parameter?)
  • 如何将Html.ActionLink转换为链接到Ajax调用的按钮?(How to convert from Html.ActionLink to a button linked to Ajax call?)
  • 应用程序如何处理Windows符号链接?(How are Windows symbolic links treated by the apps?)
  • html,js,css在jsfiddle中工作,但不在sharepoint中(html, js, css works in jsfiddle but not in sharepoint)
  • 从Ruby脚本调用Elasticsearch Rest API(Calling Elasticsearch Rest API from Ruby script)
  • 如何将嵌套setTimeouts转换为承诺(How to convert nested setTimeouts to promises)