我目前正在为游戏使用简单的UDP服务器。我已经借助ThreadPoolExecutor
实现了多线程。在阅读有关如何最大化性能的信息时,我偶然发现了ObjectPooling
。经过一番阅读后,我剩下三个问题:
1)服务器程序是否可以利用ObjectPool?
2)哪些“对象”应该合并,哪些不应该?
3)如何创建一个简单的ObjectPool?
答案 0 :(得分:2)
服务器程序将能够利用ObjectPool吗?
这不取决于应用程序的类型。对象池的有用性取决于用例。
应该合并哪个“对象”,哪些不应该?
通常,应将创建成本很高(在内存或CPU方面)的对象池化(仍然可以选择)。 避免合并任何其他类型,因为合并本身可能会变得非常昂贵。
如何创建一个简单的ObjectPool?
不要。这是一个复杂的主题。
而是使用Apache Commons Pool之类的东西。
然后我将添加自己的
我应该关心对象池吗?
直到您对性能进行基准测试而不使用它。
池化是一种冒险的模式,尤其是在多线程环境中。
池实现应该提供所需的同步,但是,如果该对象保持状态,则添加自己的对象也不错。
答案 1 :(得分:2)
这是您问题的答案,
1)服务器程序是否可以利用ObjectPool?
是的,可以合并任何对象。如果对象创建需要大量操作,通常会使用对象池。
2)哪些“对象”应该合并,哪些不应该?
任何对象都可以合并。
3)如何创建一个简单的ObjectPool?
您可以使用apache commons pool实现简单的pool。有关更多信息,请参见https://commons.apache.org/proper/commons-pool/examples.html
编辑:仅供参考,我们使用apache commons池实现了对象池,用于连接到CORBA客户端。连接到CORBA和创建对象需要花费更多时间,因此我们实现了CORBA客户端池。
答案 2 :(得分:1)
1)服务器程序是否可以利用ObjectPool?
与应用程序类型无关,这取决于用例,尤其是当程序的性能对内存和CPU敏感时。
2)哪些“对象”应该合并,哪些不应该?
IMO,什么情况使某些类对象的池有用:
除上述条件外,不得缓存对象或必须是不可变的
3)如何创建一个简单的ObjectPool?
这完全是一个复杂的话题,但是从本质上讲,您需要构建一个对象创建者(某种工厂),该对象创建者应决定是创建新对象还是返回状态已存在的所需更改。