使用对象池提高性能

在某些情况下,对象池可能非常有效,从而显著提高性能。 将对象重用到最佳优势的一般思路是尽可能多地池资源,从实际工作中排除初始化,然后在部署时对实际硬件进行管理定制。 也就是说,应按照以下步骤进行操作:

  1. 编写对象,以考虑为任何客户端执行的昂贵初始化和资源获取,作为代表客户端执行实际工作的先决条件。 将大量对象构造函数写入池中尽可能多的资源,以便在客户端从池获取对象时立即可用。
  2. 管理配置池以实现可用硬件资源的最佳平衡,通常交易专用于维护特定大小的池的内存,以换取更快的客户端访问和使用对象。 在某些时候,池将实现减少的回报,并且你可以获得足够的性能,同时限制特定组件可能的资源使用情况。

执行实际工作或获取资源

如果你有一个组件,客户端将快速连续使用,其中相当一部分的对象使用时间花费在获取资源或初始化之前为客户端执行特定工作,那么编写组件以使用对象池的几率将是一大胜。

可以编写组件,以便在对象的构造函数中执行所有客户端尽可能一致的耗时工作,从而获取一个或多个连接、运行脚本、从文件或跨网络提取初始化数据等。 这会影响池每个此类资源。 你要将资源与执行某些工作所需的泛型状态组合在一起。

在这种情况下,当客户端从池中获取对象时,它们会立即提供这些资源。 通常,它们将使用对象执行一些小型工作单元、推送或拉取数据,然后对象将调用 IObjectContext::SetCompleteIObjectContext::SetAbort 并返回。 借助快速的火力使用模式,池会产生出色的性能优势。 可以完全利用无状态自动事务编程模型的简单性,但可以与传统的有状态组件相媲美。

但是,如果客户端每次调用对象时都使用对象,则池将不太有意义。 随着使用时间相对于初始化时间的增加,获得的速度优势是边际优势。 你得到的回报会减少,这可能证明保存活动对象池所需的内存成本不合理。

跨多个客户端共享成本

考虑初始化的变体是,可以使用池来统计摊销获取昂贵资源的成本。 如果点击一次获取或初始化,然后重复使用该对象,则会在其生存期内使用该对象的所有客户端共享该成本。 每个对象只产生一次沉重的构造时间。

预分配对象

如果指定了非零最小池大小,则应用程序启动时将创建和共用最小对象数,以便为调用应用程序的任何客户端做好准备。

管理与池管理配合使用的资源

可以使用最大池大小来管理使用资源的方式。 例如,如果已获得特定数量的数据库连接许可,则可以控制随时打开的连接数。

考虑到客户端使用模式、对象使用特征和物理资源(如内存和连接)时,在进行性能优化时,可能会找到一些最佳平衡点。 池对象将在某个点后产生递减的返回。 可以确定所需的性能级别,并将其与实现它所需的资源进行平衡。

为了便于在配置对象池时进行性能优化,可以监视应用程序中组件的对象统计信息。 有关详细信息,请参阅 监视对象统计信息

提高JIT-Activated组件的性能

对象池非常适用于 COM+ 实时激活 服务。 通过池正在激活 JIT 的对象,可以加快对象重新激活的速度。 你可以获得通过 JIT 激活打开的通道的好处,同时降低重新激活的成本。 在这种情况下,可以使用池来控制要分配给具有引用活动的对象的内存量。

在 JIT 激活的组件是事务性组件时,最有可能进行池。 对象池经过优化以处理事务组件。 有关详细信息,请参阅 池事务对象

COM+ 对象构造函数字符串

控制对象生存期和状态

对象池的工作原理

池事务对象

可共用对象的要求