mirror of
https://gitlab.uni-marburg.de/langbeid/powersort.git
synced 2025-02-23 00:45:22 +01:00
jdk sort intro & benchmark preparations
This commit is contained in:
parent
9f8ca86ac0
commit
0b5c6df766
@ -0,0 +1,19 @@
|
|||||||
|
package de.uni_marburg.powersort.benchmark;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Same class and method interface as JDK23 TimSort.java with its sort() method.
|
||||||
|
* <p>
|
||||||
|
* Uses Arrays.sort() for sorting.
|
||||||
|
*/
|
||||||
|
class DummySort<T> {
|
||||||
|
public static <T> void sort(T[] a, int lo, int hi, Comparator<? super T> c,
|
||||||
|
T[] work, int workBase, int workLen) {
|
||||||
|
assert lo == 0;
|
||||||
|
assert hi == a.length;
|
||||||
|
assert work == null;
|
||||||
|
Arrays.sort(a, c);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
package de.uni_marburg.powersort.benchmark;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Same class and method interface as TimSort.java with its sort() method.
|
||||||
|
* <p>
|
||||||
|
* Uses Arrays.sort() for sorting.
|
||||||
|
* But calls it a.length times which makes this implementation really inefficient.
|
||||||
|
*/
|
||||||
|
class DummySort2<T> {
|
||||||
|
public static <T> void sort(T[] a, int lo, int hi, Comparator<? super T> c,
|
||||||
|
T[] work, int workBase, int workLen) {
|
||||||
|
assert lo == 0;
|
||||||
|
assert hi == a.length;
|
||||||
|
assert work == null;
|
||||||
|
|
||||||
|
for (int i = 0; i < a.length; i++) {
|
||||||
|
Arrays.sort(a, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
package de.uni_marburg.powersort.benchmark;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Quick intro on how sorting arrays works in JDK 23.
|
||||||
|
*/
|
||||||
|
public class Educational {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
sortObjectsAvoidingComparableTimSort();
|
||||||
|
sortObjects();
|
||||||
|
sortPrimitives();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: If this is no slower than sortObjects(), then we could avoid ComparableTimSort :)
|
||||||
|
* <p>
|
||||||
|
* Quote from JDK23 ComparableTimSort.java
|
||||||
|
* <p>
|
||||||
|
* If you are using an optimizing VM, you may find that ComparableTimSort
|
||||||
|
* offers no performance benefit over TimSort in conjunction with a
|
||||||
|
* comparator that simply returns {@code ((Comparable)first).compareTo(Second)}.
|
||||||
|
* If this is the case, you are better off deleting ComparableTimSort to
|
||||||
|
* eliminate the code duplication.
|
||||||
|
*/
|
||||||
|
private static void sortObjectsAvoidingComparableTimSort() {
|
||||||
|
SomeComparable[] a = {
|
||||||
|
new SomeComparable(1),
|
||||||
|
new SomeComparable(0)
|
||||||
|
};
|
||||||
|
|
||||||
|
NaturalOrder c = NaturalOrder.INSTANCE;
|
||||||
|
// -> TimSort.sort(a, 0, a.length, c, null, 0, 0);
|
||||||
|
// -> All elements in the array must implement the {@link Comparable} interface.
|
||||||
|
Arrays.sort(a, c);
|
||||||
|
|
||||||
|
System.out.println(Arrays.toString(a));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sortObjects() {
|
||||||
|
SomeComparable[] a = {
|
||||||
|
new SomeComparable(1),
|
||||||
|
new SomeComparable(0)
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// -> ComparableTimSort.sort(a, 0, a.length, null, 0, 0);
|
||||||
|
// -> All elements in the array must implement the {@link Comparable} interface.
|
||||||
|
Arrays.sort(a);
|
||||||
|
|
||||||
|
System.out.println(Arrays.toString(a));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sortPrimitives() {
|
||||||
|
int[] a = {1, 0};
|
||||||
|
|
||||||
|
// -> DualPivotQuicksort.sort(a, 0, 0, a.length);
|
||||||
|
Arrays.sort(a);
|
||||||
|
|
||||||
|
System.out.println(Arrays.toString(a));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
package de.uni_marburg.powersort.benchmark;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
|
public class Main {
|
||||||
|
public static void main(final String[] args) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
|
||||||
|
final SomeComparable[] a = {
|
||||||
|
new SomeComparable(1),
|
||||||
|
new SomeComparable(0)
|
||||||
|
};
|
||||||
|
|
||||||
|
final Method[] sortImplementations = getSortImplementations();
|
||||||
|
|
||||||
|
final NaturalOrder c = NaturalOrder.INSTANCE;
|
||||||
|
for (Method sortImplementation : sortImplementations) {
|
||||||
|
sortImplementation.invoke(null, a, 0, 0, c, null, 0, 0);
|
||||||
|
System.out.println(Arrays.toString(a));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static Method[] getSortImplementations() throws NoSuchMethodException {
|
||||||
|
return new Method[]{
|
||||||
|
DummySort.class.getMethod("sort", Object[].class, int.class, int.class, Comparator.class, Object[].class, int.class, int.class),
|
||||||
|
DummySort2.class.getMethod("sort", Object[].class, int.class, int.class, Comparator.class, Object[].class, int.class, int.class)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
package de.uni_marburg.powersort.benchmark;
|
||||||
|
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copied from JDK23 Arrays.java
|
||||||
|
*/
|
||||||
|
final class NaturalOrder implements Comparator<Object> {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public int compare(Object first, Object second) {
|
||||||
|
return ((Comparable<Object>) first).compareTo(second);
|
||||||
|
}
|
||||||
|
|
||||||
|
static final NaturalOrder INSTANCE = new NaturalOrder();
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package de.uni_marburg.powersort.benchmark;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A class for tiny, comparable objects.
|
||||||
|
*/
|
||||||
|
record SomeComparable(int id) implements Comparable<SomeComparable> {
|
||||||
|
@Override
|
||||||
|
public int compareTo(SomeComparable other) {
|
||||||
|
return id - other.id;
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user