4

我确信对此的正确答案取决于池对象的类型和工作负载,所以我将详细介绍一下我的实现:

我有一个 ObjectPool 用于汇集长时间运行的命令行进程。这些进程通过标准输入/标准输出进行通信,并执行文件/网络操作。许多任务的完成速度比其他任务快得多,并且可能会很快将进程返回到池中。对池的所有访问都必须是线程安全的。

我的问题是,我是使用 LIFO/Stack 还是 FIFO/ConcurrentLinkedQueue 来管理池更好?我的两面推理:

  • 堆栈保持“热”对象在运行,其中资源可能保持缓存/等。更长时间。
  • FIFO 在进程之间更均匀地平衡调用,每个进程做的工作更少。谢谢!
4

2 回答 2

3

我的第一个想法是:基准测试!你的两个论点似乎都有道理。您应该实施这两种策略并进行测试,哪些会导致更高的吞吐量。

您在问题中描述的问题类似于操作系统必须面对的进程调度。因此,也许利用优先级会很有用。使用PriorityQueue并为您的任务分配不同的优先级,这些优先级可能随时间动态变化,例如使用Aging

最后但同样重要的是,正如评论中已经指出的那样,您可以同时尝试ConcurrentLinkDeque并让一些获取前面的对象和一些后面的对象。在这里,我的建议也是尝试并衡量哪种平衡效果最好。

于 2012-07-20T00:28:46.600 回答
1

它可能不会产生性能差异。做任何最容易编码的事情,并使您的代码易于理解。当您处理执行文件和网络 I/O 的命令行进程时,这里的缓存未命中并不会产生影响……这些将占主导地位。

于 2012-07-20T00:36:07.450 回答