关于对象池的问题

Questions about ObjectPooling

我目前正在为游戏开发一个简单的 UDP 服务器。我已经在 ThreadPoolExecutor 的帮助下实现了多线程。在阅读如何最大化性能时,我偶然发现了 ObjectPooling。阅读后,我留下了 3 个问题:

1) 服务器程序能否利用 ObjectPool?

2) 哪些 "Objects" 应该合并,哪些不应该合并?

3) 如何创建一个简单的ObjectPool?

Will a server program be able to take advantage of an ObjectPool?

这不取决于应用程序的类型。对象池的用处取决于用例。

Which "Objects" should be pooled and which should not?

通常,创建起来很昂贵(在内存或 CPU 方面)的对象应该被合并(仍然可以选择)。 避免池化任何其他类型,因为池化本身会变得非常昂贵。

How to create a simple ObjectPool?

不要。这是一个复杂的主题。
相反,使用诸如 Apache Commons Pool.

之类的东西

然后我会添加我自己的

Should I care about object pooling?

除非您在不使用它的情况下对性能进行基准测试。
池化是一种有风险的模式,尤其是在多线程环境中。 池实现应该提供所需的同步,但是,添加你自己的也不错,如果该对象保持状态。

这里是您问题的答案,

1) Will a server program be able to take advantage of an ObjectPool?

是的,任何对象都可以合并。如果对象创建是繁重的操作,通常使用对象池。

2) Which "Objects" should be pooled and which should not?

可以合并任何对象。

3) How to create a simple ObjectPool?

您可以使用 apache 公共池实现简单的池。有关详细信息,请参阅 https://commons.apache.org/proper/commons-pool/examples.html

编辑: 仅供参考,我们使用 apache 公共池实现对象池以连接到 CORBA 客户端。连接到 CORBA 和创建对象需要更多时间,因此我们实施了 CORBA 客户端池。

1) Will a server program be able to take advantage of an ObjectPool?

无论应用程序类型如何,它都取决于用例,特别是当您的程序性能是内存并且 CPU 敏感时。

2) Which "Objects" should be pooled and which should not?

IMO,哪些场景使某些 class 对象的池有用:

  • 当系统一次只需要固定或有限类型(状态)的对象时
  • 当您需要对某些 ​​class
  • 的最大对象施加上限时
  • 当对象创建是内存和/或 cpu 密集型且对象可以按原样重复使用,或使用最少的操作数时
  • 当对象本身是内存密集型和/或高频使用时

除上述条件外,对象不得缓存或必须是不可变的

3) How to create a simple ObjectPool?

这完全是一个复杂的话题,但本质上您需要构建一个对象创建者(类似于工厂),它应该决定是创建新对象还是 return 现有对象并根据需要更改其状态。