关于对象池的问题
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 现有对象并根据需要更改其状态。
我目前正在为游戏开发一个简单的 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 现有对象并根据需要更改其状态。