Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

[Android] ArrayList is faster than LinkedList for reasonable N. #50767

Closed
wants to merge 4 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.atomic.AtomicLong;
Expand Down Expand Up @@ -433,7 +432,7 @@ final class ImageReaderSurfaceProducer

private Object lock = new Object();
// REQUIRED: The following fields must only be accessed when lock is held.
private final LinkedList<PerImageReader> imageReaderQueue = new LinkedList<PerImageReader>();
private final ArrayList<PerImageReader> imageReaderQueue = new ArrayList<PerImageReader>();
private final HashMap<ImageReader, PerImageReader> perImageReaders =
new HashMap<ImageReader, PerImageReader>();
private PerImageReader lastReaderDequeuedFrom = null;
Expand All @@ -452,7 +451,7 @@ public PerImage(Image image, long queuedTime) {
/** Internal class: state held per ImageReader. */
private class PerImageReader {
public final ImageReader reader;
private final LinkedList<PerImage> imageQueue = new LinkedList<PerImage>();
private final ArrayList<PerImage> imageQueue = new ArrayList<PerImage>();
private boolean closed = false;

private final ImageReader.OnImageAvailableListener onImageAvailableListener =
Expand Down Expand Up @@ -485,7 +484,7 @@ PerImage queueImage(Image image) {
imageQueue.add(perImage);
// If we fall too far behind we will skip some frames.
while (imageQueue.size() > 2) {
PerImage r = imageQueue.removeFirst();
PerImage r = imageQueue.remove(0);
r.image.close();
}
return perImage;
Expand All @@ -495,7 +494,7 @@ PerImage dequeueImage() {
if (imageQueue.size() == 0) {
return null;
}
PerImage r = imageQueue.removeFirst();
PerImage r = imageQueue.remove(0);
return r;
}

Expand Down Expand Up @@ -535,12 +534,12 @@ void pruneImageReaderQueue() {
}
// Prune nodes from the head of the ImageReader queue.
while (imageReaderQueue.size() > 1) {
PerImageReader r = imageReaderQueue.peekFirst();
PerImageReader r = imageReaderQueue.get(0);
if (!r.canPrune()) {
// No more ImageReaders can be pruned this round.
break;
}
imageReaderQueue.removeFirst();
imageReaderQueue.remove(0);
perImageReaders.remove(r.reader);
r.close();
}
Expand Down Expand Up @@ -580,7 +579,8 @@ void onImage(ImageReader reader, Image image) {
PerImage dequeueImage() {
PerImage r = null;
synchronized (lock) {
for (PerImageReader reader : imageReaderQueue) {
for (int i = 0; i < imageReaderQueue.size(); i++) {
PerImageReader reader = imageReaderQueue.get(i);
r = reader.dequeueImage();
if (r == null) {
// This reader is probably about to get pruned.
Expand Down Expand Up @@ -618,8 +618,11 @@ PerImage dequeueImage() {

private void releaseInternal() {
released = true;
for (PerImageReader pir : perImageReaders.values()) {
pir.close();
for (int i = 0; i < perImageReaders.size(); i++) {
PerImageReader reader = perImageReaders.get(i);
if (reader != null) {
reader.close();
}
}
perImageReaders.clear();
imageReaderQueue.clear();
Expand Down Expand Up @@ -735,7 +738,10 @@ private PerImageReader getActiveReader() {
// Create a new ImageReader and add it to the queue.
return getOrCreatePerImageReader(createImageReader());
}
return imageReaderQueue.peekLast();
if (imageReaderQueue.size() == 0) {
return null;
}
return imageReaderQueue.get(imageReaderQueue.size() - 1);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Need to check length here, the peek methods return null if the size isn't enough.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not that it much matters, but fun drive by comment to say you could use an ArrayDeque here instead if you wanted to keep the same convenience right? (they both implement the double ended queue interface)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a good idea, I will try that.

}
}

Expand Down Expand Up @@ -809,8 +815,8 @@ public int numImageReaders() {
public int numImages() {
int r = 0;
synchronized (lock) {
for (PerImageReader reader : imageReaderQueue) {
r += reader.imageQueue.size();
for (int i = 0; i < imageReaderQueue.size(); i++) {
r += imageReaderQueue.get(i).imageQueue.size();
}
}
return r;
Expand Down