什么是懒加载?

95

什么是懒加载?

[阅读几个答案后编辑] 为什么人们经常使用这个术语?

假设您只使用ASP/ADO记录集,并将其加载到数据或ADO.NET数据源中以供网格视图使用。

我想我应该问为什么人们使用懒加载这个术语,还有哪些“其他”类型?

13个回答

231

它被称为“懒加载”,就像一个懒惰的人一样,你推迟了做你不想做的事情。相反的是“急切加载”,它会在需要之前立即加载某些东西。

如果你好奇为什么人们可能使用懒加载,请考虑一个需要很长时间才能启动的应用程序。这个应用程序可能会进行大量的急切加载......从磁盘加载东西,进行计算等等,而这些东西在实际使用前很久就已经加载完成了。

与此相比,懒加载应用程序将更快地启动,但当你第一次需要执行某些需要长时间运行的操作时,可能会稍微有点停顿,因为它是第一次加载。因此,使用懒加载,你可以在运行应用程序的过程中分摊加载时间...并且你可能会节省加载用户可能永远不打算使用的东西的时间。


@Mike Stone,你好,能否解释一下何时使用惰性加载和急切加载呢? 据我所知,如果运行文件管理器,它会利用惰性加载设计。 - Alston

42

懒加载是一种编程实践,只有在第一次需要使用对象时才进行加载或初始化。这可以潜在地大幅提升性能,尤其是当应用程序中存在大量组件时。

通常情况下,维基百科上有更详细的信息。


14

惰性加载是一个概念,指我们延迟加载对象,直到需要使用它。简单来说,按需对象加载而不是无谓地加载对象。例如,如果您有一个“Customer”类,其中包含“Orders”对象,则您希望加载客户数据,但是订单对象可以推迟到应用程序需要时再加载。

下面是一个YouTube视频,演示了如何使用惰性加载,以及如何实现惰性加载和它的优缺点。

http://www.youtube.com/watch?v=2SrfdAkwmFo


9

维基百科的定义
懒加载是一种常见的设计模式,用于计算机编程中推迟对象初始化的时间,直到需要使用该对象时才进行初始化。

http://en.wikipedia.org/wiki/Lazy%20loading


7
术语“懒加载”通常在谈论对象关系映射器时使用。如果直接使用ADO.NET,则始终会获得贪婪加载(即它始终只加载您指定的内容)。
像nHibernate这样的OR映射器支持返回代理对象,只有在访问数据时才会填充正确的数据。这样,您只加载实际使用的数据。当您指定许多可以从数据库加载的对象之间的关系时,这是一项有用的功能,您不希望OR映射器加载所有相关对象以及相关对象的相关对象等。这可能导致整个数据库被加载。
通过仔细设计您的对象模型也可以避免此问题。(使用聚合并仅加载聚合根,例如在领域驱动设计中,是一种避免使用懒加载的方法)
懒加载可能导致or映射器执行大量小型数据库访问,而不是一次检索所需的所有数据。这也可能导致性能问题。

5

以下是我编写的一些实际Python代码示例:

class Item(Model):
    ...
    @property
    def total(self):
        if not hasattr(self, "_total"):
            self._total = self.quantity \
                  + sum(bi.quantity for bi in self.borroweditem_set.all())
        return self._total

基本上,我有一个Item类,代表我们库存中的物品。我们拥有的物品总数是我们拥有的数量加上从各种来源借用的所有物品的总和。这些数字都存储在我们的数据库中,在请求总数之前计算它是没有意义的(因为通常会在不请求总数的情况下使用物品)。

因此,total属性检查_total字段是否存在。如果不存在,则属性代码查询数据库并计算它,然后将值存储在_total字段中,以便下次请求时无需重新计算。


4
懒加载:你不会浪费时间(也不会占用内存)去加载你可能不需要的东西。当你需要时,它会花费更长的时间,但没关系。
生活中的例子:与其真正学习那本法语短语书,你可以在需要的时候逐个学习短语。这种方式什么情况下更合理呢?如果你只在法国待一段时间(即你不需要很多短语),或者你需要很快离开。如果你在那里待两年和/或你有足够的时间学习,那么提前学习整本短语书可能更加高效(急切加载)。
[灵感来自于Venus在WKRP上以帮派术语教授原子的课程.]

并不总是正确的认为事情花费更长时间就没关系。我曾经经历过,当懒加载没有以最优方式实现时,它实际上会显著减慢应用程序的速度。 - Captain Sensible
1
@SeventhElement 我并不是在争论这样做是否好。这是理解惰性加载的基础。如果情况不允许(例如,UI 变得迟缓或出于任何其他原因),您可以选择急切加载。 - Dan Rosenstark

4

延迟加载是数据库中经常使用的术语,指的是仅在需要时加载所需信息的部分。

例如,假设您需要一个包含几个表的连接记录。如果一次性获取所有内容,则需要的时间比只获取主表要长。使用延迟加载,只有在需要时才会获取其余信息。因此,在某些情况下实际上是“高效加载”。

其他类型的“加载”包括:

  1. 急切加载 - 一次性加载所有连接的表。

3

延迟加载的一些优点:

  1. 减少应用程序启动时间。
  2. 由于按需加载,应用程序消耗的内存较少。
  3. 避免不必要的服务器请求。

3

是一种设计模式。

懒加载:只有当您的代码需要执行某个特定对象的操作时,该对象才会被初始化。一旦初始化完成,它就不会重新初始化该对象,而是使用先前初始化过的对象。

这使得您的代码更加高效,并有助于管理内存使用。

懒加载的示例应用:

Ghost 懒初始化 值持有者


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接