Skip to content

Instantly share code, notes, and snippets.

@tivrfoa
Created October 12, 2023 21:39
Show Gist options
  • Save tivrfoa/b96e4c9c0eb9ae3d444b2273e21dc27d to your computer and use it in GitHub Desktop.
Save tivrfoa/b96e4c9c0eb9ae3d444b2273e21dc27d to your computer and use it in GitHub Desktop.
Java LinkedList vs ArrayDeque vs ArrayList
/*
Benchmark Mode Cnt Score Error Units
LinkedListBenchmark.arrayDeque avgt 6 86861,575 ± 6681,783 ns/op
LinkedListBenchmark.arrayList avgt 6 207511,921 ± 20828,824 ns/op
LinkedListBenchmark.linkedList avgt 6 70281,152 ± 9929,807 ns/op
mvn clean verify
java -jar target/benchmarks.jar LinkedListBenchmark
Scenario:
Using it as a queue and removing the first element when processing
*/
package org.sample;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Warmup;
@Fork (value = 2, warmups = 1)
@Warmup (iterations = 2, time = 3, timeUnit = TimeUnit.SECONDS)
@Measurement (iterations = 3, time = 1, timeUnit = TimeUnit.SECONDS)
@BenchmarkMode (Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@State(Scope.Benchmark)
public class LinkedListBenchmark {
final static int MAX = 10_000;
@Benchmark
public List<Integer> linkedList() {
List<Integer> ret = new ArrayList<>();
LinkedList<Integer> list = new LinkedList<>();
for (int i = 0; i < MAX; i++) {
list.add(i);
if (i % 50 == 0) {
ret.add(list.removeFirst());
}
}
return ret;
}
@Benchmark
public List<Integer> arrayDeque() {
List<Integer> ret = new ArrayList<>();
ArrayDeque<Integer> list = new ArrayDeque<>();
for (int i = 0; i < MAX; i++) {
list.add(i);
if (i % 50 == 0) {
ret.add(list.removeFirst());
}
}
return ret;
}
@Benchmark
public List<Integer> arrayList() {
List<Integer> ret = new ArrayList<>();
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < MAX; i++) {
list.add(i);
if (i % 50 == 0) {
ret.add(list.remove(0));
}
}
return ret;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment