1

在我的 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(),以及从另一个类中获取 Deque。在计时每次迭代时,我发现对于 4421 个对象的 Deque 大小,它需要 7756 毫秒。而对于 103 个对象的 Deque 大小,则需要 43 毫秒。

4

1 回答 1

1

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

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

另一方面,如果您想知道您的执行时间与问题的大小有什么关系,那么我们需要更多地了解您TrajectoryThread的 s.

于 2015-02-28T13:42:00.807 回答