【问题标题】:java array deque size vs performance [closed]java数组双端队列大小与性能[关闭]
【发布时间】:2015-05-01 04:16:41
【问题描述】:

在我的 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 毫秒。

【问题讨论】:

  • 您忘记提及您使用的是哪个 Deque 实现。
  • “从另一个类获取[一个对象]”并不是真正的“操作”。
  • 不要依赖即兴时间测量的结果。你是如何测量的?
  • 你的问题是什么?
  • 我正在使用 java.util.ArrayDeque。我用这个作为时间:

标签: java performance data-structures arraydeque


【解决方案1】:

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

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

另一方面,如果您想知道您的执行时间与问题的规模有什么关系,那么我们需要更多地了解您的TrajectoryThreads 中发生了什么。

【讨论】:

  • 是的,事实证明它是另一个类中的函数。
猜你喜欢
  • 1970-01-01
  • 2013-01-05
  • 2014-06-22
  • 2016-02-11
  • 1970-01-01
  • 2017-05-06
  • 2017-07-17
  • 2016-12-13
  • 2013-05-21
相关资源
最近更新 更多