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

标签 java performance data-structures arraydeque

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

最佳答案

当遇到此类性能问题时,大多数时候正确的方法是先获取良好的性能监控数据,然后再推测程序的哪个部分速度较慢。您可以使用类似 VisualVM 的工具为了达成这个。

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

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

关于java 数组双端队列大小与性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28782234/

相关文章:

java - 根据字段值在 1 个查询中运行 2 个 mongodb 更新

java - 什么数据结构可以容纳以下数据?

java - 具有 SSL-Handshake-Exception 的 Android JavaX-Mail

java - 有没有更有效的方法来写入文件?

c++ - cuBLAS 矩阵求逆比 MATLAB 慢得多

java - Android(Java)性能问题?

java - 我的 DFS 图形方法不会从 int 变为 String

java - 为什么链表要有父类

java - 如何拦截用户与 UI 交互产生的 motionEvents 和 keyEvents

c++ - 在链表中插入字符串以段错误结束