在我的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 个操作(更准确地说,add
在 constant amortised time 中运行。);理论上来说,这些操作是使用低级数组操作来执行的,这在实践中非常快。所以我不会担心这个。
另一方面,如果您想知道执行时间与问题的大小有何关系,那么我们需要更多地了解您的 TrajectoryThread
中发生的情况。
关于java 数组双端队列大小与性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28782234/