延迟加载(lazy loading) 设计模式是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据(读取属性值)的时候,才真正执行数据加载操作.
有效使用它可以大大提高系统性能.
为了便于理解, 我们来建立一个场景, 假设我们要构造一个Hero(英雄) 类, 每个Hero 有自己的名字和(SpecialSkill)特殊技能.
建模
这是一种建立的方法:
public class Hero
{
public string FullName { get; set; }
public string Name { get; set; }
public SpecialSkill Skill{ get; set; }
public Hero(string name)
{
Name = name;
FullName = "Super " + name;
Skill = new SpecialSkill(name);
}
}
public class SpecialSkill
{
public int Power { get; set; }
public string SkillName { get; set; }
public int StrengthSpent { get; set; }
public SpecialSkill(string name)
{
Console.WriteLine("loading special skill .....");
Power = name.Length;
StrengthSpent = name.Length * 3;
SkillName = name + " Blazing";
Console.WriteLine(SkillName + ",... this's what makes a legend!");
}
}
class Program
{
static void Main(string[] args)
{
Hero hero = new Hero("wukong");
Console.WriteLine("\n\n.......................Press Enter to continue.......................\n\n");
Console.Read();
Console.WriteLine("Hero's special skill: " + hero.Skill.SkillName);
Console.Read();
Console.Read();
}
}
运行程序后输出如下, 这个例子非常的容易理解, 结果也是显然的.
它的缺点是, 当运行Hero 构造函数的时候, SpecialSkill 的所有属性都已经加载了. 如果我们只想获取这个Hero 的FullName, 我们也加载了SpecialSkill 所有值.
属性的加载延迟
在没有Lazy<T> 以前我们可以这样做:
public class Hero
{
public string FullName { get; set; }
public string Name { get; set; }
private SpecialSkill skill;
public SpecialSkill Skill
{
get { return skill ?? (skill = new SpecialSkill(Name)); }
}
public Hero(string name)
{
Name = name;
FullName = "Super " + name;
}
}
即: 修改属性SpecialSkill的加载方法. 那么当我们再运行程序时, 得到的输出就是:
非常好! 这就是我们要的效果, 这样可以让系统更加的有效率.
Lazy<T>
当net framework 引入了Lazy<T> 类后, 我们也可以使用它来实现:
public class Hero
{
public string FullName { get; set; }
public string Name { get; set; }
private readonly Lazy<SpecialSkill> skill;
public SpecialSkill Skill
{
get { return skill.Value; }
}
public Hero(string name)
{
Name = name;
FullName = "Super " + name;
skill = new Lazy<SpecialSkill>(() => new SpecialSkill(name));
}
}
Lazy<T>提供对延迟初始化的支持。而 Lazy<T> 中的一个属性 Value, 则是获取当前 Lazy<T> 实例的延迟初始化值。
Lazy<T>的优势
那么既然我们已经可以用属性缓存的方法实现, 为什么还要引入Lazy<T> ?
至少Lazy<T> 有以下几点优势:
- 它具有 LazyThreadSafetyMode, 但是我们一般不使用它, 除非是很关键的情况下(在此略去181个字)
- 它使属性的定义行更加简单
- 从语义上来讲, 它更加明确, 更加具有可读性
- 它允许null为有效值
分享到:
相关推荐
首先要发n多个请求,性能肯定不怎么好,而我们用延迟加载技术,页面打开时候 只加载第一屏数据,第二屏以上都用延迟加载 滚动的时候进行加载,这样的话 假如页面不管他有n屏的话 那么我们只管加载第一屏的数据,后面...
及早加载可以提高查询性能,但是也会增加数据传输量,因为可能会一次性加载大量数据。 显式加载 显式加载是指在需要时手动加载导航属性,适用于在已经查询到主实体的情况下,需要加载其关联实体的场景。这种方式...
这是一个面试经常问到的问题:js的延迟加载方法 (js的延迟加载有助于提高页面的加载速度) 主要考察对程序的性能方面是否有研究,程序的性能是一个项目不断地追求的,通常也是项目完成后需要长期做的一件事情,像腾讯...
通常开发者会通过JQuery、Knockout、Underscore...在这篇文章里,我将解释 RequireJS框架如何帮助应用开发者写出更加模块化的代码,以及它是如何通过延迟加载JavaScript文件来提高应用性能的。 开始的部分我们先不用R
这可以避免在动态导入块时出现瀑布,并可以提高延迟加载块的性能,尤其是在慢/高延迟连接上。 安装 npm i --save-dev rollup-plugin-hoist-import-deps 或者 yarn add -D rollup-plugin-hoist-import-deps 用法 ...
通常开发者会通过JQuery、Knockout、Underscore...在这篇文章里,我将解释RequireJS框架如何帮助应用开发者写出更加模块化的代码,以及它是如何通过延迟加载JavaScript文件来提高应用性能的。 开始的部分我们先不用R
这种方式有助于提高于应用程序的性能,避免浪费计算,节省内存的使用等。针对于这种做法,似乎称之为即用即创建更为合适些。先来看一下在Framework4.0中如何实现延迟加载。 Framework4.0提供了一个包装类 Lazy,可以...
C#基础 延迟加载介绍与实例,有效使用它可以大大提高系统性能,需要的朋友可以参考一下
新功能:延迟 JavaScript 执行-通过延迟 JavaScript 文件的加载直到用户交互(例如,滚动,单击)来提高性能 新功能:预加载链接-在用户单击链接之前预取页面,以提高感知的加载速度和用户体验) 增强功能:启用...
用于在应用程序中延迟加载图像的 Vue 模块。 该项目的一些值得注意的目标包括轻量级、... 使用 Intersection Observer 来提高大量节点的性能。 如果仅提供事件,则删除该事件的所有侦听器。 手动触发延迟加载位置计算。
对于图片较多的页面,使用懒加载可以大幅提高页面加载速度,...这样子对于页面加载性能上会有很大的提升,也提高了用户体验。 原理 将页面中的img标签src指向一张小图片或者src为空,然后定义data-src(这个属性可以自
这个时候,我们需要利用懒加载,也就是延迟加载图片的方式,来提高网站的亲和力。 一、延迟加载图片 基本思路如下: 给需要延迟加载的图片设置自定义属性比如lazy-src,存在图片源所在路径。然后将所有需要懒加载的...
在开发H5项目中有时候会遇到要加载大量图片的情况,利用预加载技术可以提高用户浏览时的体验。 1)概念: 懒加载也叫延迟加载:JS图片延迟加载,延迟加载图片或符合某些条件时才加载某些图片。 预加载:提前加载图片...
它通过只加载可见的媒体元素来提高网站的性能,折叠下的元素在页面滚动后加载。该插件有许多选项,支持回调和特殊的延迟事件,允许具有不同的加载效果(例如淡入和微调器效果)。插件及其插件的示例包括Ajax、背景...
当过多的图片还没出现在视野的时候就已经下载,可以使用angular-imglazyload 来避免这种无谓的请求提高性能 安装 项目使用可以直接 bower install angular-imglazyload 下载至项目使用 ,学习的同学可参照下面步骤 ...
guolebinfen获得全国大学生电子商务“创新 创意 创业”挑战赛黑龙江省赛区一等奖。咱村网为广大农民朋友搭建一个全面的农村服务网站,利用电商...网站首页运用图片延迟加载,运用ajax异步请求后台信息提高网站性能。
您的网站未达到预期效果的原因之一是图片过多。 网站加载速度是SEO在分析和排名网站时考虑的关键因素之一。... Magento 2图像延迟加载扩展允许您启用图像的延迟加载,以减小页面大小并提高网站性能。
好处:先从单表查询,需要时再从关联表去关联查询,大大提高数据库性能,因为查询单表 要比关联查询多张表速 度要快。 坏处 : 因为只有当需要用到数据时,才会进行数据库查询,这样在大批量数据查询时,因为查询工 ...
0.9.3版-添加了指向选项页面的链接-添加了加载动画-修复了一些由空格键0.9.2版引起的错误-快速阅读现在应该可以在每个网站上正常使用(请注意,不适用于pdf文件)0.9.1版-可以设置读取开始之前的延迟(在选项页面上...
最小化这些延迟时间可以改善页面的整体性能。 3、减少引用外部脚本文件的数量。每个 HTTP 请求都会产生额外的性能负担,下载一个 100KB 的文件比下载四个 25KB 的文件要快。总之,减少引用外部脚本文件的数量。 4、...