我有一段代码可以从队列中获取所有元素。之后我不关心队列的状态,我可以保证在我从中删除元素时不会修改队列。
我最初使用迭代器来提取元素,因为我认为它会比轮询元素更快......
但我进行了以下测试:
ConcurrentLinkedQueue<Object> queue = new ConcurrentLinkedQueue<>();
for (int i=0; i < 1000000; i++)
queue.add(new Object());
LinkedList<Object> list = new LinkedList<>();
long start = System.currentTimeMillis();
for (Object object: queue)
list.add(object);
long time1 = System.currentTimeMillis() - start;
list = new LinkedList<>();
start = System.currentTimeMillis();
Object object;
while ((object = queue.poll()) != null)
list.add(object);
long time2 = System.currentTimeMillis() - start;
System.out.println(time1 + " " + time2);
我得到以下输出(平均超过 100 次运行)
1169 46
我的问题是:为什么轮询比迭代快?这对我来说完全不直观,因为 poll 将不得不修改队列并且迭代只需要查看状态。
编辑---格雷是对的
我循环运行它并得到输出(应该首先这样做)
1180 46
1422 25
287 32
14 26
226 26
236 25
12 26
14 25
13 25
13 26
13 25
268 25
13 25
14 176
13 26
13 26
13 25
13 25
13 26
13 24
13 26
13 25
...