93

什么是延迟加载?

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

假设您只使用一个 ASP/ADO 记录集并将其与数据或 ADO.NET 数据源一起加载用于 gridview。

我想我应该问为什么人们使用“延迟加载”这个词,他们的“其他”类型是什么?

4

13 回答 13

227

它被称为延迟加载,因为就像一个懒惰的人一样,你正在推迟做你不想做的事情。与之相反的是急切加载,您可以在需要时立即加载某些内容。

如果你很好奇人们为什么会使用延迟加载,可以考虑一个需要 LOOOOONG 时间才能启动的应用程序。这个应用程序可能正在做很多急切的加载......从磁盘加载东西,并在需要它之前进行计算等等。

将此与延迟加载相比,应用程序启动速度会快得多,但是当您第一次需要执行需要长时间运行负载的操作时,第一次加载时可能会有轻微的暂停。因此,通过延迟加载,您可以在整个运行应用程序的过程中分摊加载时间......实际上您可以节省加载用户可能永远不会使用的东西。

于 2008-08-30T19:44:05.653 回答
40

延迟加载是一种编程实践,您只在第一次需要对象时才加载或初始化它。这可能会给您带来很大的性能提升,尤其是当您的应用程序中有很多组件时。

像往常一样,维基百科有更多细节。

于 2008-08-30T19:26:21.687 回答
14

延迟加载是一个概念,我们将对象单元的加载延迟到我们需要的地方。简单地说就是按需加载对象,而不是不必要地加载对象。例如,如果您有一个聚合了“订单”对象的“客户”类。因此,您希望加载客户数据,但您希望延迟订单对象,直到您的应用程序需要它。

下面是一个 youtube 视频,它演示了如何使用延迟加载,我们如何实现延迟加载以及相同的优缺点。

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

于 2013-09-14T05:48:08.900 回答
9

维基百科的定义延迟加载是计算机编程中常用的一种设计模式,用于将对象的初始化推迟到需要它的时候。...

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

于 2008-08-30T19:21:21.747 回答
7

在谈论对象关系映射器时,通常使用术语延迟加载。如果您直接使用 ADO.NET,您总是会得到预先加载(即它总是加载您指定的内容)。

像 nHibernate 这样的 OR-mapper 支持返回代理对象,这些代理对象只有在您访问数据时才会用正确的数据“填充”。这样你只加载你真正使用的数据。当您指定可以从数据库加载的对象之间的大量关系时,这是一个有用的功能,您不希望 OR-mapper 加载所有相关对象以及与相关对象相关的对象等等。这可能会导致您的整个数据库被加载。

这个问题也可以通过仔细设计你的对象模型来避免。(使用聚合并只加载聚合根,就像在域驱动设计中一样,是一种在不使用延迟加载的情况下解决这个问题的方法)。

延迟加载可能导致 or 映射器执行大量小型数据库访问,而不是一次检索您需要的所有数据。这也可能导致性能问题。

于 2008-08-30T21:36:29.753 回答
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 字段中,以便下次请求时无需重新计算。

于 2008-08-30T19:35:22.273 回答
4

延迟加载:您不会将时间(或记忆)浪费在您可能不需要的东西上。然后当你需要它时,它需要更长的时间,但这很好。

生活中的例子:你不是真正学习那本法语短语手册,而是一次学习一个短语,因为它们是需要的。这什么时候有意义?如果您只打算在法国逗留很短的时间(即,您不需要很多短语)或者您需要很快离开。如果你在那里呆了两年和/或你有很长的时间学习,那么提前学习整个短语手册可能会更有效率(急切地加载)。

[受到维纳斯在 WKRP 上以帮派方式教授的 Atom 的启发。]

于 2009-07-22T01:15:41.223 回答
4

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

即假设您需要有一个连接多个表的记录。如果您一次获取所有内容,则将比仅获取主表花费更长的时间。使用延迟加载将仅在需要时获取其余信息。因此,在某些情况下,它实际上是“高效加载”。

其他类型的“加载”是:

  1. Eager Loading - 一次加载所有连接的表。
于 2009-08-15T02:25:33.543 回答
3

是一种设计模式。

延迟加载:在您的代码需要特定对象完成某些操作之前,对象不会被初始化,一旦它被初始化,它就不会重新初始化对象,而是使用先前初始化的对象。

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

延迟加载的示例应用:

Ghost 懒惰初始化值持有者

于 2009-07-22T00:56:53.517 回答
3

延迟加载的一些优点:

  1. 最小化应用程序的启动时间。
  2. 由于按需加载,应用程序消耗的内存更少。
  3. 避免了对服务器的不必要请求。
于 2016-02-02T06:05:35.120 回答
2

延迟加载的一个示例是在网页上包含大量数据的网格或表格,以查看应用程序仅加载用户浏览器视点大小的位置。当他们向下滚动以查看更多内容或数据时,此时将加载更多数据。

这也通过 ajax 或 jQuery 成为一种常见的视觉/交互设计模式。

如上所述,相反的是急切加载,您不考虑客户端,因此可能会影响性能。

于 2012-02-26T18:46:54.723 回答
1

Lazy<T>现在是 c# 4.0 的一部分 - MSDN上有一个很好的页面解释了这个概念。

于 2009-11-03T21:31:38.817 回答
0

根据 geeksforgeeks 的说法,延迟加载是一种软件设计模式,其中对象的初始化仅在实际需要时才进行,而不是在之前进行,以保持使用的简单性并提高性能。

https://www.geeksforgeeks.org/lazy-loading-design-pattern/

于 2018-10-07T17:00:10.423 回答