我想知道是否有某种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秒或更小)。因此,我的问题,我应该担心吗?现在我知道你会告诉我对应用程序进行分析,但我在构建应用程序之前首先构建了库,如果应用程序出现问题会导致重大更改
答案 0 :(得分:4)
是的,您可以使用简单的布尔标志推迟它。当然,你需要处理标志和结果的波动性......如果一个线程在仍在计算结果时询问结果,请确保你知道你想要的结果。哦,尽量避免锁定。并且在线程安全方面使其全部防弹。
不,使用专家建造的类型没有任何好处;)
说真的:如果有其他人为你做过,为什么要这样做呢?为什么要编写代码来检查标志,找出如何安全地等待,锁定所有内容等等。即使 是一个相对简单的事情要做对,如果它只需要完成它就更好曾经以可重复使用的方式。
这个原则的另一个好例子是Nullable<T>
。您可以自己轻松地获得大多数相同的行为(不是装箱),甚至根本不打扰封装,只需在正常场地旁边保留一个标志......但内置类型,你可以免费实现所有这些,以及语法糖等。
答案 1 :(得分:2)
Lazy类使这个过程更容易。它类似于使用String而不是字符数组。在技术上没有必要,但可能有用。
答案 2 :(得分:2)
Lazy<T>
只是实现懒惰单例的最佳方式的封装。如果你想要线程安全,那么它不仅仅是if(!initialized) instance = Initialize();
。我通常认为BCL团队在实施方面比我更好。
更新:根据您的示例,我会说Lazy<>
的优势就是维护代码的代码更少。除此之外,它们基本上是等同的。我的建议是:使用Lazy<>
因为它很容易并且继续解决更难的问题。
答案 3 :(得分:1)
Lazy类为您完成所有线程安全工作,这是一种比手动实现更复杂的事情。