- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
LazyInitializer 之间有什么区别?和 Lazy<T>类?我知道他们都只会按需初始化对象。我什么时候需要使用它们中的每一个?
最佳答案
我不确定你是否还在研究这个,但我不得不深入研究这两个 Lazy<T>
的细节和 LazyInitializer.EnsureInitialized<T>()
最近,所以我想我应该分享我的发现。
首先,一些数字。我使用这两种方法对一千万个值的批处理使用这两种方法运行基准测试,使用 GC.GetTotalMemory(true)
测试内存使用情况。并得到 Stopwatch
实例化、首次值访问和后续值访问的时间安排:
Lazy<T> Memory Use: 320,000,000 bytes (32B/instance)
EnsureInitialized<T>() Memory Use: N/A
Lazy<T> Instantiation Time: 622.01 ms
EnsureInitialized<T>() Inst. Time: N/A
Lazy<T> First Access: 1,373.50 ms
EnsureInitialized<T>() First Access: 72.94 ms
Lazy<T> Subsequent Accesses: 18.51 ms
EnsureInitialized<T>() Subsequent: 13.75 ms
(我将 LazyThreadSafetyMode.PublicationOnly
与 Lazy<T>'s
一起使用,这看起来与 LazyInitializer
默认采用的线程安全方法相同。)
如您所见,在这种情况下,除非我以某种方式搞砸了我的测试(绝不可能!)LazyInitializer
几乎在所有可量化的方面都表现出色。它没有内存或实例化开销,而且创建和检索值的速度都更快。
那么,为什么要使用 Lazy<T>
?好吧,首先,这些是我的 x64 系统上的测试结果,在其他情况下您可能会得到不同的结果。
Lazy<T>
也可以产生更清晰和更简洁的代码。 return myLazy.Value;
比return LazyInitializer.EnsureInitialized(ref myValue, () => GetValue(foo));
友好多了
此外,Lazy<T>
如果你正在处理一个值类型,或者处理一个可以合法地是 null
的引用类型,这会让事情变得简单得多.与 LazyInitializer
,您必须使用第二个 bool 字段来跟踪该值是否已初始化,从而加剧了代码清晰度问题。 Lazy<T>
如果您想要更严格的线程安全,使用起来也更简单。
在宏伟的计划中,对于很多应用程序来说,大部分开销可能可以忽略不计(尽管并非总是如此——我开始研究这个的原因是因为我正在开发一个涉及数百万非常小的懒惰的应用程序-加载的值,以及 Lazy<T>
的每个实例 32 字节的开销实际上开始变得不方便)。
最后,除非您的应用程序非常占用内存,否则我认为这通常取决于个人喜好。对于非空引用类型,我个人认为LazyInitializer.EnsureInitialized<T>()
是一种更优雅的方法,但我也可以挖掘代码清晰度的论点。
关于c# - LazyInitializer 与 Lazy<T> 类。何时使用每一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12007267/
真实世界Haskell的第8章 globToRegex' (c:cs) = escape c ++ globToRegex' cs 这个函数不是尾递归的,它说答案依赖于 Haskell 非严格(惰性)
documentation for gather/take mentions Binding to a scalar or sigilless container will also force la
Lazy 模块中有两种力量: val force : 'a t -> 'a force x forces the suspension x and returns its result. If x h
在 Lazy.Force 的 MSDN 文档中扩展方法说: Forces the execution of this value and returns its result. Same as Val
我正在编写一个 MVC 5 互联网应用程序,我有一个关于使用 interface 的问题与 Lazy initialization . 这里是有问题的类定义: public class WebAPIT
我对 real world haskell 中的代码有点困惑 import qualified Data.ByteString.Lazy.Char8 as L8 import qualified Da
我从 Hibernate 迁移到 EclipseLink,因为我们需要 EclipseLink 可以很好地处理复合主键,而 Hibernate 则不能(确实不能!)。现在我正在修复我们的 JUnit
我正在观看 Java 内存模型视频演示,作者说与 Lazy Initialization 相比,使用 Static Lazy Initialization 更好,我不清楚他说的是什么想说。 我想接触社
我想使用 Rust 和 once_cell实现一些静态常量结构实例,一个静态常量向量包含这些静态结构实例。 示例代码如下: use once_cell::sync::Lazy; pub struct
首先我必须承认:我对 Haskell 完全陌生。我已经练习了一些,现在在字符串操作方面遇到了一些麻烦: 我需要删除/删除从字符串末尾开始的字符。我期望函数 dropWhileEnd 执行此操作,但是当
我想使用 Rust 和 once_cell实现一些静态常量结构实例,一个静态常量向量包含这些静态结构实例。 示例代码如下: use once_cell::sync::Lazy; pub struct
我有一个 Lazy>其中 T 是一个类,它有一个巨大的字符串和关于文件的元数据。我们称它们为属性 HugeString和属性(property)Metadata 我有这个 U 类,它具有相同的属性 H
下面的代码是使用 str1 替换字符串的三种不同方式( str2 、 str3 和 Data.Text.Lazy.replace ) .他们应该给出相同的输出。 import Data.Text.La
我有一个表 Image 保存图像信息。我还想存储图像本身。我也应该 1.将 Blob 存储在同一个图像表中,然后像下面这样延迟获取它 @Basic(optional = false, fetch =
在这篇快速文章中,我们将通过一个例子来讨论Spring的@Lazy注解。 默认情况下,Spring IoC容器会在应用程序启动时创建并初始化所有单体Bean。我们可以通过使用@Lazy注解来阻止单体B
我有一个 viewController,因为我使用了 Page 控件。每个页面有 4 个 ImageView 。 我已经通过了 Xml 并根据其中的图像数量得到了 pageControl 的页数,即
我使用了一个名为 blazy 的 js,当我向下滚动页面到它时,图像会加载。 图像显示在 pingdom 速度测试中,如果延迟加载适用于图像,它是否应该显示在速度测试树中? 最佳答案 根据我的经验,我
浏览器级别的 Lazyload 是几乎所有浏览器的新功能( https://developer.mozilla.org/en-US/docs/Web/Performance/Lazy_loading
我想尝试惰性表达式评估,但我现在不想深入研究 Haskel。拜托,你能帮忙找出其他语言有这个功能吗? 最佳答案 你可以用多种语言模拟它。 this例如,是 C++ 的通用惰性求值器。正如文章所说,它也
关注,据说foldl'是 foldl 的严格版本. 但是我很难理解,strict 是什么意思?意思是?? foldl f z0 xs0 = lgo z0 xs0 where
我是一名优秀的程序员,十分优秀!