Nun, man kann natürlich eine
halbherzige Erweiterung
[spoiler]
package bytewelt;
import java.util.Random;
public class SlangListTest2
{
private static final int RUNS = 10;
public static void main(String[] args)
{
for (int n=10; n<=10000; n*=10)
{
javaslang.collection.List<String> listSlangA =
javaslang.collection.List.empty();
testSlangFront(listSlangA, n);
javaslang.collection.List<String> listSlangB =
javaslang.collection.List.empty();
testSlangBack(listSlangB, n);
java.util.List<String> arrayListJavaA =
new java.util.ArrayList<String>();
testJavaFront("Array front", arrayListJavaA, n);
java.util.List<String> arrayListJavaB =
new java.util.ArrayList<String>();
testJavaBack("Array back", arrayListJavaB, n);
java.util.List<String> linkedListJavaA =
new java.util.LinkedList<String>();
testJavaFront("Linked front", linkedListJavaA, n);
java.util.List<String> linkedListJava =
new java.util.LinkedList<String>();
testJavaBack("Linked back", linkedListJava, n);
}
}
private static void testSlangFront(javaslang.collection.List<String> list, int n)
{
long before = 0;
long after = 0;
before = System.nanoTime();
for (int r=0; r<RUNS; r++)
{
for (int i=0; i<n; i++)
{
String s = String.valueOf(i);
list = list.prepend(s);
}
}
after = System.nanoTime();
System.out.printf("%16s %8d create took %10.3f
",
"slang front", n, (after-before) / 1e6);
Random random = new Random(0);
before = System.nanoTime();
for (int r=0; r<RUNS; r++)
{
for (int i=0; i<n/2; i++)
{
String s = String.valueOf(random.nextInt(n));
list.remove(s);
}
}
after = System.nanoTime();
System.out.printf("%16s %8d remove took %10.3f
",
"slang front", n, (after-before) / 1e6);
}
private static void testSlangBack(javaslang.collection.List<String> list, int n)
{
long before = 0;
long after = 0;
before = System.nanoTime();
for (int r=0; r<RUNS; r++)
{
for (int i=0; i<n; i++)
{
String s = String.valueOf(i);
list = list.append(s);
}
}
after = System.nanoTime();
System.out.printf("%16s %8d create took %10.3f
",
"slang back", n, (after-before) / 1e6);
Random random = new Random(0);
before = System.nanoTime();
for (int r=0; r<RUNS; r++)
{
for (int i=0; i<n/2; i++)
{
String s = String.valueOf(random.nextInt(n));
list.remove(s);
}
}
after = System.nanoTime();
System.out.printf("%16s %8d remove took %10.3f
",
"slang back", n, (after-before) / 1e6);
}
private static void testJavaFront(String name, java.util.List<String> list, int n)
{
long before = 0;
long after = 0;
before = System.nanoTime();
for (int r=0; r<RUNS; r++)
{
for (int i=0; i<n; i++)
{
String s = String.valueOf(i);
list.add(0, s);
}
}
after = System.nanoTime();
System.out.printf("%16s %8d create took %10.3f
",
name, n, (after-before) / 1e6);
Random random = new Random(0);
before = System.nanoTime();
for (int r=0; r<RUNS; r++)
{
for (int i=0; i<n/2; i++)
{
String s = String.valueOf(random.nextInt(n));
list.remove(s);
}
}
after = System.nanoTime();
System.out.printf("%16s %8d remove took %10.3f
",
name, n, (after-before) / 1e6);
}
private static void testJavaBack(String name, java.util.List<String> list, int n)
{
long before = 0;
long after = 0;
before = System.nanoTime();
for (int r=0; r<RUNS; r++)
{
for (int i=0; i<n; i++)
{
String s = String.valueOf(i);
list.add(s);
}
}
after = System.nanoTime();
System.out.printf("%16s %8d create took %10.3f
",
name, n, (after-before) / 1e6);
Random random = new Random(0);
before = System.nanoTime();
for (int r=0; r<RUNS; r++)
{
for (int i=0; i<n/2; i++)
{
String s = String.valueOf(random.nextInt(n));
list.remove(s);
}
}
after = System.nanoTime();
System.out.printf("%16s %8d remove took %10.3f
",
name, n, (after-before) / 1e6);
}
}
[/spoiler]
vornehmen, um dann
slang front 10 create took 3,402
slang front 10 remove took 26,428
slang back 10 create took 43,220
slang back 10 remove took 0,176
Array front 10 create took 0,165
Array front 10 remove took 0,096
Array back 10 create took 0,021
Array back 10 remove took 0,064
Linked front 10 create took 0,058
Linked front 10 remove took 0,074
Linked back 10 create took 0,032
Linked back 10 remove took 0,057
slang front 100 create took 1,396
slang front 100 remove took 4,191
slang back 100 create took 43,064
slang back 100 remove took 3,701
Array front 100 create took 0,603
Array front 100 remove took 1,542
Array back 100 create took 0,190
Array back 100 remove took 1,342
Linked front 100 create took 0,487
Linked front 100 remove took 3,238
Linked back 100 create took 0,291
Linked back 100 remove took 1,183
slang front 1000 create took 1,866
slang front 1000 remove took 56,783
slang back 1000 create took 1273,141
slang back 1000 remove took 33,671
Array front 1000 create took 5,008
Array front 1000 remove took 20,266
Array back 1000 create took 0,709
Array back 1000 remove took 18,366
Linked front 1000 create took 0,841
Linked front 1000 remove took 26,185
Linked back 1000 create took 0,713
Linked back 1000 remove took 23,861
slang front 10000 create took 6,546
slang front 10000 remove took 3717,308
slang back 10000 create took 94599,650
slang back 10000 remove took 3471,409
Array front 10000 create took 615,936
Array front 10000 remove took 1994,952
Array back 10000 create took 4,744
Array back 10000 remove took 2101,244
Linked front 10000 create took 3,398
Linked front 10000 remove took 2654,178
Linked back 10000 create took 6,606
Linked back 10000 remove took 2675,041
zu erhalten, aber nochmal: DAS SOLLTE MAN NICHT ZU ERNST NEHMEN (ist ja eine ziemlich sinnlose Zusammenwürfelung von Operationen), und am Ende ist auch nicht klar, was genau damit gezeigt werden soll. Mehr als “Man sollte die richtige Datenstruktur für die jeweilige Aufgabe verwenden” kann man daraus im Endeffekt nicht ablesen. (BTW: Es gibt einen Benchmark unter https://github.com/javaslang/javaslang/blob/master/javaslang-benchmark/src/test/java/javaslang/benchmark/MicroBenchmark.java , aber keinen Vergleich mit anderen Listen - wäre vielleicht mal eine Überlegung wert). Ich denke, es gibt durchaus Rechtfertigungen für immutable/persistente Datenstrukturen, darüber wurde ja schon an anderen Stellen ausführlich geredet.