java 数组双端队列大小与性能

java array deque size vs performance

在我的 java 代码中,我怀疑 java.util.ArrayDeque 大小影响了性能,但我想在这里确认是否是这种情况。

while (!otherClass.getDeque().isEmpty()){
  Trajectory t1 = otherClass.getDeque.remove();
  Runnable tr1 = new TrajectoryThread();
  Thread thread1 = new Thread(tr1);
  thread1.start();

if (!otherClass.getDeque().isEmpty()){
  Trajectory t2 = otherClass.getDeque.remove();
  Runnable tr2 = new TrajectoryThread();
  Thread thread2 = new Thread(tr2);
  thread2.start();

在我的代码中,如果双端队列不为空,我将删除轨迹对象并在新线程上启动模拟,直到 40 个模拟同时 运行。在每次模拟结束时,都有可能向队列中添加更多轨迹。如果在所有模拟完成后队列中仍有轨迹,则该过程会自行重复。

我使用的操作是 remove() 、add()、isEmpty() 以及从另一个 class 获取双端队列。在为每次迭代计时时,我发现对于大小为 4421 个对象的双端队列,它需要 7756 毫秒。而对于大小为 103 个对象的双端队列,则需要 43 毫秒。

当遇到诸如此类的性能问题时,大多数时候正确的做法是先获取良好的性能监控数据,然后再推测程序的哪一部分运行缓慢。您可以使用 VisualVM 之类的工具来实现此目的。

如果您想知道 java.util.ArrayDeque 操作是否会导致程序变慢,那么答案几乎可以肯定是 ,因为它们的执行时间主要由创建线程和 运行 模拟的开销。 ArrayDeque非常快。他们 运行 您在评论中列出的 3 个操作在恒定时间内(更准确地说,add 运行s 在 constant amortised time 中);从理论上讲,这些操作是使用低级数组操作执行的,这在实践中非常快。所以我不会担心那个。

另一方面,如果您想知道执行时间与问题大小的相关性如何,那么我们需要更深入地了解您的 TrajectoryThread 中发生的情况。