`
javasee
  • 浏览: 961081 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

延迟加载 -- 提高性能

 
阅读更多

延迟加载(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();
    }
}
 
 
运行程序后输出如下, 这个例子非常的容易理解, 结果也是显然的.

ScreenShot066

 

它的缺点是, 当运行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的加载方法. 那么当我们再运行程序时, 得到的输出就是:

ScreenShot067

 

非常好! 这就是我们要的效果, 这样可以让系统更加的有效率.

 

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> 有以下几点优势:

  1. 它具有 LazyThreadSafetyMode, 但是我们一般不使用它, 除非是很关键的情况下(在此略去181个字)
  2. 它使属性的定义行更加简单
  3. 从语义上来讲, 它更加明确, 更加具有可读性
  4. 它允许null为有效值
0
1
分享到:
评论

相关推荐

    图片延迟加载-juery-lazyload

    图片延迟加载是一种优化网页性能的技术,它通过在用户滚动页面时才加载可见区域内...总的来说,jQuery Lazyload 是一个强大且易用的图片延迟加载解决方案,通过合理配置和使用,可以有效地改善网页性能,提高用户体验。

    mybatis延迟加载样例

    在实际开发中,为了提高性能和减少内存消耗,MyBatis提供了延迟加载(Lazy Loading)功能。延迟加载允许我们在真正需要数据时才去加载关联的对象,而不是在查询主对象时一次性加载所有关联数据。 标题中的“mybatis...

    jquery图片延迟加载

    图片延迟加载是一种优化网页性能的技术,它不立即加载页面上的所有图片,而是只加载当前视口内的图片。当用户滚动页面时,原本隐藏在视口之外的图片会逐渐进入视野,此时才进行加载。这样可以显著减少初始页面加载...

    图片懒加载--适合你的前端技巧

    综上所述,图片懒加载是前端开发中一种有效的性能优化手段,通过合理运用,我们可以提高网站性能,提升用户满意度。在实际开发中,应根据项目需求和用户群体特点,灵活选择并定制合适的懒加载策略。

    jquery.lazyload.js 图片懒加载 --demo

    它是一种高效的图片延迟加载插件,允许我们在用户滚动到图片所在位置时才开始加载,从而显著提高网页的加载速度。 **1. jQuery LazyLoad.js 的工作原理** jQuery LazyLoad.js 的核心思想是“按需加载”。它监控...

    延迟加载 html优化

    同时,需要注意的是,虽然延迟加载能提高加载速度,但过度依赖可能会对SEO产生负面影响,因为搜索引擎爬虫可能无法抓取到延迟加载的内容。因此,在实际应用中需要找到平衡,兼顾用户体验和搜索引擎优化。

    图片延时加载实例

    图片延时加载(也称为懒加载)则只在图片进入浏览器视口时才开始加载,这样可以显著提高页面的加载速度,节省用户的流量。 `lazyload`框架的工作原理主要包括以下几个步骤: 1. **标记待延迟加载的图片**:首先,...

    mybatis3--延迟加载,缓存

    因此,合理地管理 SqlSession 可以提高性能。 2. **二级缓存(Global Cache)**:二级缓存是 Mapper(namespace)级别的缓存,它可以跨 SqlSession 共享数据。开启二级缓存需要在 MyBatis 配置文件中设置 `&lt;cache/&gt;...

    图片延迟加载的jq

    图片延迟加载是一种优化网页性能的技术,它通过只加载视口内的图片来减少页面初始化时的数据传输量,提高页面加载速度,提升用户体验。在本场景中,我们关注的是使用jQuery库实现这一功能的jQuery.lazyload插件。 ...

    图片懒加载(延迟加载)

    3. **优化技巧**:为了提高性能,可以使用Intersection Observer API,它提供了一种更有效的方式监听元素何时进入或离开视口。此外,还可以使用Web Workers进行后台图片预加载,或者利用Intersection Observer的`...

    hibernate 延迟加载深入剖析

    其中,延迟加载(Lazy Loading)是一种非常重要的特性,它可以显著提高应用程序的性能和响应速度。本文将对Hibernate中的延迟加载技术进行深入剖析,帮助读者更好地理解和运用这项技术。 #### 二、基本概念 ##### ...

    ExtJs GridPanel延时加载.rar

    GridPanel是ExtJs中一个非常重要的组件,它用于展示表格数据,而延时加载则是一种优化大量数据处理的技术,可以显著提高用户界面的响应速度。 1. **ExtJs GridPanel**: GridPanel是ExtJs中的核心组件之一,它提供...

    网页图片延迟加载插件

    网页图片延迟加载,也称为懒加载(Lazy Loading),是一种优化网页性能的技术,它允许网页在初始加载时只加载可见区域的图片,而将其他非可视区域的图片推迟到用户滚动到相应位置时再加载。这种技术可以显著减少网页...

    hibernate延迟加载解决

    在大型项目中,由于数据量庞大,为了提高性能和减少数据库的负载,Hibernate引入了“延迟加载”(Lazy Loading)机制。标题和描述提到的“hibernate延迟加载解决”主要涉及如何理解和解决与之相关的常见问题。 **1....

    延迟加载js代码下载(包括页面延迟加载以及图片延迟加载)

    综上所述,延迟加载是提升网页性能的有效手段,通过JavaScript和jQuery,我们可以轻松地实现页面和图片的延迟加载,从而提高用户访问体验。提供的压缩包文件JqueryLazyLoad.rar和LazyLoad.rar可能包含了实现这些功能...

    HTML延迟加载图片 html图片延迟加载技术大全.zip

    总的来说,HTML图片延迟加载技术通过智能地控制图片加载时机,有效地提高了网页性能,降低了服务器压力,同时也提升了用户体验。无论是在纯JavaScript环境还是在使用jQuery或其他前端框架的情况下,都有成熟的解决...

    jquery 图片延迟加载

    图片延迟加载,也称为懒加载,是一种优化网页性能的技术。它使得图片在用户滚动到可视区域时才开始加载,而不是在页面初次加载时一次性加载所有图片。这样可以显著减少初始加载时间,提高用户体验,特别是对于移动...

    ext扩展 延时加载

    延时加载(Lazy Loading)是一种设计模式,主要用于改善应用性能。在JavaScript中,它意味着不立即加载所有代码和数据,而是等到用户触发特定操作或组件需要时才进行加载。这可以显著提高应用程序的启动速度,尤其...

    原生js延迟加载

    在JavaScript的世界里,延迟加载(Lazy Loading)是一种优化网页性能的技术,它允许我们仅在真正需要时才加载资源,如图片、脚本或视频。这种技术可以显著减少初始页面加载时间,提高用户体验,并减少服务器压力。...

    Lazyload 延迟加载效果 -源码.zip

    5. **优化**:为了进一步提高性能,可以采用预加载策略,对即将进入视口的资源提前加载,或者利用Intersection Observer API等现代浏览器特性来更精确地跟踪元素进入视口的状态。 6. **兼容性考虑**:在编写延迟...

Global site tag (gtag.js) - Google Analytics